kirico 1.0.5 → 1.1.0

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.
@@ -49,6 +49,43 @@ ja:
49
49
  old_address_yomi: 変更前被保険者住所(カナ)
50
50
  old_address: 変更前被保険者住所(漢字)
51
51
  memo: 備考欄
52
+ # 月額変更届
53
+ kirico/data_record2221700:
54
+ prefecture_code: 都道府県コード
55
+ area_code: 群市区符号
56
+ office_code: 事業所記号
57
+ ip_code: 被保険者整理番号
58
+ ip_name_yomi: 被保険者氏名(カナ)
59
+ ip_name: 被保険者氏名(漢字)
60
+ birth_at: 生年月日
61
+ applied_at: 改定年月日
62
+ old_monthly_standard_income_hel_ins: 従前の標準報酬月額(健保)
63
+ old_monthly_standard_income_pns_ins: 従前の標準報酬月額(厚保)
64
+ old_applied_at: 従前の改定年
65
+ income_updated_at: 昇(降)給年月日
66
+ income_updated_type: 昇(降)給区分
67
+ retroacted_payment_at: 遡及支払月
68
+ retroacted_payment: 遡及支払額
69
+ before_3_month_days: 給与計算の基礎日数(前三ヶ月)
70
+ before_2_month_days: 給与計算の基礎日数(前二ヶ月)
71
+ before_1_month_days: 給与計算の基礎日数(前一ヶ月)
72
+ before_3_month_income_currency: 通貨によるものの額(前三ヶ月)
73
+ before_2_month_income_currency: 通貨によるものの額(前二ヶ月)
74
+ before_1_month_income_currency: 通貨によるものの額(前一ヶ月)
75
+ before_3_month_income_goods: 現物によるものの額(前三ヶ月)
76
+ before_2_month_income_goods: 現物によるものの額(前二ヶ月)
77
+ before_1_month_income_goods: 現物によるものの額(前一ヶ月)
78
+ avg_adjustment: 修正平均額
79
+ my_number: 個人番号
80
+ area_code_of_basic_pension_number: 基礎年金番号 課所符号
81
+ serial_number_of_basic_pension_number: 基礎年金番号 一連番号
82
+ seventy_years_and_over: 70歳以上被用者
83
+ work_in_multiple_company: 二以上勤務
84
+ short_time_worker: 短時間労働者(特定適用事業所等)
85
+ reason: 月額変更に該当することになった理由
86
+ change_only_hel_ins: 健康保険のみ月額変更
87
+ memo: 備考欄
88
+ submit_only_seventy_years_and_over: 70歳以上被用者届のみ提出
52
89
  # 算定基礎届
53
90
  kirico/data_record22257041:
54
91
  area_code: 都市区符号
@@ -78,9 +115,71 @@ ja:
78
115
  income_diff_amount: 昇(降)給差の月額
79
116
  income_updated_at: 昇(降)給年月日
80
117
  memo: 備考欄
118
+ # 2018年3月以降 算定基礎届
119
+ kirico/data_record2225700:
120
+ prefecture_code: 都道府県コード
121
+ area_code: 群市区符号
122
+ office_code: 事業所記号
123
+ ip_code: 被保険者整理番号
124
+ ip_name_yomi: 被保険者氏名(カナ)
125
+ ip_name: 被保険者氏名(漢字)
126
+ birth_at: 生年月日
127
+ applied_at: 適用年月日
128
+ old_monthly_standard_income_hel_ins: 従前の標準報酬月額(健保)
129
+ old_monthly_standard_income_pns_ins: 従前の標準報酬月額(厚保)
130
+ old_applied_at: 従前の改定年月日
131
+ apr_days: 支払基礎日数(4月)
132
+ may_days: 支払基礎日数(5月)
133
+ jun_days: 支払基礎日数(6月)
134
+ apr_income_currency: 通貨によるものの額(4月)
135
+ may_income_currency: 通貨によるものの額(5月)
136
+ jun_income_currency: 通貨によるものの額(6月)
137
+ apr_income_goods: 現物によるものの額(4月)
138
+ may_income_goods: 現物によるものの額(5月)
139
+ jun_income_goods: 現物によるものの額(6月)
140
+ avg_adjustment: 修正平均額
141
+ ip_type: 被保険者区分
142
+ income_updated_at: 昇(降)給年月日
143
+ income_updated_type: 昇(降)給区分
144
+ retroacted_payment_at: 遡及支払月
145
+ retroacted_payment: 遡及支払額
146
+ my_number: 個人番号
147
+ area_code_of_basic_pension_number: 基礎年金番号 課所符号
148
+ serial_number_of_basic_pension_number: 基礎年金番号 一連番号
149
+ seventy_years_and_over: 70歳以上被用者算定
150
+ seventy_years_old_months: 70歳以上被用者 算定基礎月
151
+ work_in_multiple_company: 二以上勤務
152
+ will_change_monthly_income: 月額変更予定
153
+ join_middle_of_month: 中途入社
154
+ leave_of_absence: 病休・育休・休職等
155
+ short_time_worker: 短時間労働者(特定適用事業所等)
156
+ part_time_worker: パート
157
+ annual_average_caluculation: 年間平均
158
+ memo: 備考欄
159
+ submit_only_seventy_years_and_over: 70歳以上被用者届のみ提出
160
+ # 賞与支払届
161
+ kirico/data_record2265700:
162
+ prefecture_code: 都道府県コード
163
+ area_code: 群市区符号
164
+ office_code: 事業所記号
165
+ ip_code: 被保険者整理番号
166
+ ip_name_yomi: 被保険者氏名(カナ)
167
+ ip_name: 被保険者氏名(漢字)
168
+ birth_at: 生年月日
169
+ bonus_payment_at: 賞与支払日
170
+ payment_in_currency: 通貨支給額
171
+ payment_in_goods: 現物支給額
172
+ my_number: 個人番号
173
+ area_code_of_basic_pension_number: 基礎年金番号 課所符号
174
+ serial_number_of_basic_pension_number: 基礎年金番号 一連番号
175
+ seventy_years_and_over: 70歳以上被用者算定
176
+ work_in_multiple_company: 二以上勤務
177
+ first_payment_day_of_multiple_payments_within_the_same_month: 同一月内の賞与合算 初回支払日
178
+ submit_only_seventy_years_and_over: 70歳以上被用者届のみ提出
81
179
  kirico/company:
82
180
  sr_name: 社会保険労務士氏名
83
181
  count: 事業所数情報
182
+ prefecture_code: 都道府県コード
84
183
  area_code: 都市区符号
85
184
  office_code: 事業所記号
86
185
  office_number: 事業所番号
@@ -89,8 +188,11 @@ ja:
89
188
  address: 事業所所在地
90
189
  name: 事業所名称
91
190
  owner_name: 事業主氏名
92
- tel_number: 電話番号
191
+ tel_area_code: 電話番号 市外局番等
192
+ tel_city_code: 電話番号 市内局番等
193
+ tel_subscriber_number: 電話番号 加入者番号
93
194
  kirico/fd_management_record:
195
+ prefecture_code: 都道府県コード
94
196
  area_code: 都市区符号
95
197
  office_code: 事業所記号
96
198
  fd_seq_number: FD通番
@@ -16,7 +16,7 @@ module Kirico
16
16
  end
17
17
 
18
18
  def to_csv
19
- raise NoMethodError
19
+ raise NotImplementedError
20
20
  end
21
21
  end
22
22
  end
@@ -8,6 +8,7 @@ module Kirico
8
8
  include Virtus.model
9
9
  include ActiveModel::Validations
10
10
 
11
+ attribute :prefecture_code, String
11
12
  attribute :area_code, String
12
13
  attribute :office_code, String
13
14
  attribute :office_number, String
@@ -16,17 +17,22 @@ module Kirico
16
17
  attribute :address, String
17
18
  attribute :name, String
18
19
  attribute :owner_name, String
19
- attribute :tel_number, String
20
+ attribute :tel_area_code, String
21
+ attribute :tel_city_code, String
22
+ attribute :tel_subscriber_number, String
20
23
 
24
+ validates :prefecture_code, charset: { accept: [:numeric] }, sjis_bytesize: { is: 2 }
21
25
  validates :area_code, charset: { accept: [:numeric] }, sjis_bytesize: { is: 2 }
22
- validates :office_code, charset: { accept: %i(numeric latin katakana) }, sjis_bytesize: { in: 1..4 }
26
+ validates :office_code, charset: { accept: %i[numeric latin katakana] }, sjis_bytesize: { in: 1..4 }
23
27
  validates :office_number, charset: { accept: [:numeric] }, sjis_bytesize: { in: 1..5 }
24
28
  validates :zip_code1, charset: { accept: [:numeric] }, sjis_bytesize: { is: 3 }
25
29
  validates :zip_code2, charset: { accept: [:numeric] }, sjis_bytesize: { is: 4 }
26
30
  validates :address, charset: { accept: [:all] }, sjis_bytesize: { in: 1..75 }
27
- validates :name, charset: { accept: %i(katakana kanji) }, sjis_bytesize: { in: 1..50 }
28
- validates :owner_name, charset: { accept: %i(katakana kanji) }, sjis_bytesize: { in: 1..25 }, space_divider: { space: :both_width }
29
- validates :tel_number, charset: { accept: %i(latin numeric) }, sjis_bytesize: { in: 1..12 }
31
+ validates :name, charset: { accept: %i[katakana kanji] }, sjis_bytesize: { in: 1..50 }
32
+ validates :owner_name, charset: { accept: %i[katakana kanji] }, sjis_bytesize: { in: 1..25 }, space_divider: { space: :both_width }
33
+ validates :tel_area_code, charset: { accept: %i[latin numeric] }, sjis_bytesize: { in: 2..5 }
34
+ validates :tel_city_code, charset: { accept: %i[latin numeric] }, sjis_bytesize: { in: 1..4 }
35
+ validates :tel_subscriber_number, charset: { accept: %i[latin numeric] }, sjis_bytesize: { in: 4..5 }
30
36
 
31
37
  def initialize
32
38
  yield(self) if block_given?
@@ -34,6 +40,7 @@ module Kirico
34
40
 
35
41
  def to_csv
36
42
  [
43
+ prefecture_code,
37
44
  area_code,
38
45
  office_code,
39
46
  office_number,
@@ -42,7 +49,9 @@ module Kirico
42
49
  address,
43
50
  name,
44
51
  owner_name,
45
- tel_number
52
+ tel_area_code,
53
+ tel_city_code,
54
+ tel_subscriber_number
46
55
  ].map { |attr| attr.to_s.encode('CP932') }.join(',')
47
56
  end
48
57
  end
@@ -23,18 +23,18 @@ module Kirico
23
23
  attribute :memo, String
24
24
 
25
25
  validates :area_code, charset: { accept: [:numeric] }, sjis_bytesize: { is: 2 }
26
- validates :office_code, charset: { accept: %i(numeric latin katakana) }, sjis_bytesize: { in: 1..4 }
26
+ validates :office_code, charset: { accept: %i[numeric latin katakana] }, sjis_bytesize: { in: 1..4 }
27
27
  validates :ip_code, charset: { accept: [:numeric] }, sjis_bytesize: { in: 1..6 }
28
28
  validates :basic_pension_number1, charset: { accept: [:numeric] }, sjis_bytesize: { is: 4 }, allow_blank: true
29
29
  validates :basic_pension_number2, charset: { accept: [:numeric] }, sjis_bytesize: { is: 6 }, allow_blank: true
30
30
  validates :zip_code1, charset: { accept: [:numeric] }, sjis_bytesize: { is: 3 }
31
31
  validates :zip_code2, charset: { accept: [:numeric] }, sjis_bytesize: { is: 4 }
32
- validates :new_address_yomi, charset: { accept: %i(numeric latin katakana) }, sjis_bytesize: { in: 1..75 }
32
+ validates :new_address_yomi, charset: { accept: %i[numeric latin katakana] }, sjis_bytesize: { in: 1..75 }
33
33
  validates :new_address, charset: { accept: [:all] }, sjis_bytesize: { in: 0..74 }, allow_blank: true
34
34
  validates :updated_at, timeliness: { on_or_before: :today, type: :date }
35
35
  validates :ip_name_yomi, charset: { accept: [:katakana] }, sjis_bytesize: { in: 1..25 }, space_divider: { space: :half_width }
36
36
  validates :ip_name, charset: { accept: [:all] }, sjis_bytesize: { in: 0..24 }, allow_blank: true, space_divider: { space: :full_width }
37
- validates :old_address_yomi, charset: { accept: %i(numeric latin katakana) }, sjis_bytesize: { in: 1..75 }
37
+ validates :old_address_yomi, charset: { accept: %i[numeric latin katakana] }, sjis_bytesize: { in: 1..75 }
38
38
  validates :old_address, charset: { accept: [:all] }, sjis_bytesize: { in: 0..74 }, allow_blank: true
39
39
  validates :memo, charset: { accept: [:all] }, sjis_bytesize: { in: 0..75 }, allow_blank: true
40
40
 
@@ -0,0 +1,175 @@
1
+ # frozen_string_literal: true
2
+
3
+ # 月額変更届・70歳以上被用者月額変更届データレコード
4
+ module Kirico
5
+ class DataRecord2221700 < ApplicationRecord
6
+ DOC_CODE = '2221700'
7
+
8
+ attribute :prefecture_code, String
9
+ attribute :area_code, String
10
+ attribute :office_code, String
11
+ attribute :ip_code, String
12
+ attribute :ip_name_yomi, String
13
+ attribute :ip_name, String
14
+ attribute :birth_at, Date
15
+ attribute :applied_at, Date
16
+ attribute :old_monthly_standard_income_hel_ins, Integer
17
+ attribute :old_monthly_standard_income_pns_ins, Integer
18
+ attribute :old_applied_at, Date
19
+ attribute :income_updated_at, Date
20
+ attribute :income_updated_type, Symbol
21
+ attribute :retroacted_payment_at, Date
22
+ attribute :retroacted_payment, Integer
23
+ [3, 2, 1].each do |month|
24
+ attribute "before_#{month}_month_days", String
25
+ attribute "before_#{month}_month_income_currency", String
26
+ attribute "before_#{month}_month_income_goods", String
27
+ end
28
+ attribute :avg_adjustment, Integer
29
+ attribute :my_number, String
30
+ attribute :area_code_of_basic_pension_number, String
31
+ attribute :serial_number_of_basic_pension_number, String
32
+ attribute :seventy_years_and_over, Integer
33
+ attribute :work_in_multiple_company, Integer
34
+ attribute :short_time_worker, Integer
35
+ attribute :reason, String
36
+ attribute :change_only_hel_ins, Integer
37
+ attribute :memo, String
38
+ attribute :submit_only_seventy_years_and_over, Integer
39
+
40
+ define_format_date_method :birth_at, :applied_at, :old_applied_at, :income_updated_at, :retroacted_payment_at
41
+ define_code_mapper_method :birth_at_era_nengo, :applied_at_era_nengo, :old_applied_at_era_nengo, :income_updated_type
42
+ define_in_k_method :old_monthly_standard_income_hel_ins, :old_monthly_standard_income_pns_ins
43
+
44
+ validates :prefecture_code, charset: { accept: [:numeric] }, sjis_bytesize: { is: 2 }
45
+ validates :area_code, charset: { accept: [:numeric] }, sjis_bytesize: { is: 2 }
46
+ validates :office_code, charset: { accept: %i[numeric latin katakana] }, sjis_bytesize: { in: 1..4 }
47
+ validates :ip_code, charset: { accept: [:numeric] }, sjis_bytesize: { in: 0..6 }, allow_blank: true
48
+ validates :ip_name_yomi, charset: { accept: [:katakana] }, sjis_bytesize: { in: 1..25 }, space_divider: { space: :half_width }
49
+ validates :ip_name, charset: { accept: [:all] }, sjis_bytesize: { in: 0..24 }, allow_blank: true, space_divider: { space: :full_width }
50
+ validates :applied_at, timeliness: { on_or_after: -> { Date.new(1989, 1, 8) }, type: :date }
51
+ validates :old_monthly_standard_income_hel_ins, numericality: { greater_than_or_equal_to: 1_000, less_than_or_equal_to: 9_999_999 }, allow_blank: true
52
+ validates :old_monthly_standard_income_pns_ins, numericality: { greater_than_or_equal_to: 1_000, less_than_or_equal_to: 9_999_999 }, allow_blank: true
53
+ validates :old_applied_at, timeliness: { on_or_after: -> { Date.new(1989, 1, 8) }, type: :date }
54
+ validates :income_updated_at, timeliness: { on_or_after: -> { Date.new(1989, 1, 8) }, type: :date }, allow_blank: true
55
+ validates :income_updated_type, inclusion: { in: %i[income_updated_type_0 income_updated_type_1] }, allow_blank: true
56
+ validates :retroacted_payment_at, timeliness: { on_or_after: -> { Date.new(1989, 1, 8) }, type: :date }, allow_blank: true
57
+ validates :retroacted_payment, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }, allow_blank: true
58
+ [3, 2, 1].each do |month|
59
+ validates "before_#{month}_month_income_currency", numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }
60
+ validates "before_#{month}_month_income_goods", numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }
61
+ end
62
+ validates :avg_adjustment, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }, allow_blank: true
63
+ validates :my_number, charset: { accept: [:numeric] }, sjis_bytesize: { is: 12 }, allow_nil: true
64
+ validates :area_code_of_basic_pension_number, charset: { accept: [:numeric] }, sjis_bytesize: { is: 4 }, allow_nil: true
65
+ validates :serial_number_of_basic_pension_number, charset: { accept: [:numeric] }, sjis_bytesize: { is: 6 }, allow_nil: true
66
+ validates :seventy_years_and_over, inclusion: { in: [1] }, allow_nil: true
67
+ validates :work_in_multiple_company, inclusion: { in: [1] }, allow_nil: true
68
+ validates :short_time_worker, inclusion: { in: [1] }, allow_nil: true
69
+ validates :reason, charset: { accept: [:all] }, sjis_bytesize: { in: 0..75 }
70
+ validates :change_only_hel_ins, inclusion: { in: [1] }, allow_nil: true
71
+ validates :memo, charset: { accept: [:all] }, sjis_bytesize: { in: 0..75 }, allow_nil: true
72
+ validates :submit_only_seventy_years_and_over, inclusion: { in: [1] }, allow_nil: true
73
+
74
+ validate :each_month_days_should_be_greater_than_or_equal_11_or_17
75
+ validate :seventy_years_and_over_employee_need_to_input_my_number_or_basic_pension_number
76
+
77
+ def initialize
78
+ yield(self) if block_given?
79
+ end
80
+
81
+ # rubocop:disable all
82
+ def to_csv
83
+ [
84
+ DOC_CODE,
85
+ prefecture_code,
86
+ area_code,
87
+ office_code,
88
+ ip_code,
89
+ ip_name_yomi,
90
+ ip_name,
91
+ mapped_birth_at_era_nengo,
92
+ fmt_era_ymd_birth_at,
93
+ mapped_applied_at_era_nengo,
94
+ applied_at_era_year,
95
+ applied_at_month,
96
+ old_monthly_standard_income_hel_ins.nil? ? nil : old_monthly_standard_income_hel_ins_in_k.to_s.rjust(4, '0'),
97
+ old_monthly_standard_income_pns_ins.nil? ? nil : old_monthly_standard_income_pns_ins_in_k.to_s.rjust(4, '0'),
98
+ mapped_old_applied_at_era_nengo,
99
+ old_applied_at_era_year,
100
+ old_applied_at_month,
101
+ income_updated_at.nil? ? nil : income_updated_at_month,
102
+ mapped_income_updated_type,
103
+ retroacted_payment_at.nil? ? nil : retroacted_payment_at_month,
104
+ retroacted_payment.nil? ? nil : retroacted_payment,
105
+ applied_at.prev_month(3).strftime('%m'),
106
+ applied_at.prev_month(2).strftime('%m'),
107
+ applied_at.prev_month(1).strftime('%m'),
108
+ before_3_month_days.to_s.rjust(2, '0'),
109
+ before_2_month_days.to_s.rjust(2, '0'),
110
+ before_1_month_days.to_s.rjust(2, '0'),
111
+ before_3_month_income_currency,
112
+ before_2_month_income_currency,
113
+ before_1_month_income_currency,
114
+ before_3_month_income_goods,
115
+ before_2_month_income_goods,
116
+ before_1_month_income_goods,
117
+ round_income(income_total(before_3_month_income_currency, before_3_month_income_goods)),
118
+ round_income(income_total(before_2_month_income_currency, before_2_month_income_goods)),
119
+ round_income(income_total(before_1_month_income_currency, before_1_month_income_goods)),
120
+ round_income(income_all_total),
121
+ round_income(income_average),
122
+ avg_adjustment.nil? ? nil : avg_adjustment,
123
+ my_number,
124
+ area_code_of_basic_pension_number,
125
+ serial_number_of_basic_pension_number,
126
+ seventy_years_and_over,
127
+ work_in_multiple_company,
128
+ short_time_worker,
129
+ reason,
130
+ change_only_hel_ins,
131
+ memo,
132
+ submit_only_seventy_years_and_over,
133
+ ].map { |attr| attr.to_s.encode('CP932') }.join(',')
134
+ end
135
+ # rubocop:enable all
136
+
137
+ def income_total(currency, goods)
138
+ currency.to_i + goods.to_i
139
+ end
140
+
141
+ def income_all_total
142
+ [
143
+ income_total(before_3_month_income_currency, before_3_month_income_goods),
144
+ income_total(before_2_month_income_currency, before_2_month_income_goods),
145
+ income_total(before_1_month_income_currency, before_1_month_income_goods)
146
+ ].sum
147
+ end
148
+
149
+ # 1 円未満は切り捨て
150
+ def income_average
151
+ income_all_total / 3
152
+ end
153
+
154
+ def round_income(income)
155
+ income < 10_000_000 ? income : 9_999_999
156
+ end
157
+
158
+ private
159
+
160
+ # 一般の被保険者(短時間労働者以外)の場合、17~31 日の範囲で設定する
161
+ # 短時間労働者(特定適用事業所のみ)の場合、11~31 日の範囲で設定する
162
+ def each_month_days_should_be_greater_than_or_equal_11_or_17
163
+ threshold = short_time_worker == 1 ? 11 : 17
164
+ [3, 2, 1].each do |month|
165
+ errors.add(:base, "前#{month}ヶ月の給与計算の基礎日数は、#{threshold}~31日の範囲で設定しなくてはいけません") unless threshold <= send(:"before_#{month}_month_days").to_i && send(:"before_#{month}_month_days").to_i <= 31
166
+ end
167
+ end
168
+
169
+ def seventy_years_and_over_employee_need_to_input_my_number_or_basic_pension_number
170
+ return if seventy_years_and_over.nil?
171
+
172
+ errors.add(:base, '70歳以上被用者の場合、マイナンバー、もしくは基礎年金番号の入力は必須です。') if my_number.nil? && area_code_of_basic_pension_number.nil? && serial_number_of_basic_pension_number.nil?
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,227 @@
1
+ # frozen_string_literal: true
2
+
3
+ # 2018年3月以降の算定基礎届データレコード
4
+ module Kirico
5
+ class DataRecord2225700 < ApplicationRecord
6
+ DOC_CODE = '2225700'
7
+ COVERED_MONTHS = %i[apr may jun].freeze
8
+
9
+ attribute :prefecture_code, String
10
+ attribute :area_code, String
11
+ attribute :office_code, String
12
+ attribute :ip_code, String
13
+ attribute :ip_name_yomi, String
14
+ attribute :ip_name, String
15
+ attribute :birth_at, Date
16
+ attribute :applied_at, Date
17
+ attribute :old_monthly_standard_income_hel_ins, Integer
18
+ attribute :old_monthly_standard_income_pns_ins, Integer
19
+ attribute :old_applied_at, Date
20
+ attribute :income_updated_at, Date
21
+ attribute :income_updated_type, Symbol
22
+ attribute :retroacted_payment_at, Date
23
+ attribute :retroacted_payment, Integer
24
+ COVERED_MONTHS.each do |month|
25
+ attribute "#{month}_days", Integer
26
+ attribute "#{month}_income_currency", Integer
27
+ attribute "#{month}_income_goods", Integer
28
+ end
29
+ attribute :avg_adjustment, Integer
30
+ attribute :my_number, String
31
+ attribute :ip_type, Symbol
32
+ attribute :area_code_of_basic_pension_number, String
33
+ attribute :serial_number_of_basic_pension_number, String
34
+ attribute :seventy_years_and_over, Integer
35
+ attribute :seventy_years_old_months, String
36
+ attribute :work_in_multiple_company, Integer
37
+ attribute :will_change_monthly_income, Integer
38
+ attribute :join_middle_of_month, Integer
39
+ attribute :leave_of_absence, Integer
40
+ attribute :short_time_worker, Integer
41
+ attribute :part_time_worker, Integer
42
+ attribute :annual_average_caluculation, Integer
43
+ attribute :memo, String
44
+ attribute :submit_only_seventy_years_and_over, Integer
45
+
46
+ define_format_date_method :birth_at, :applied_at, :old_applied_at, :income_updated_at, :retroacted_payment_at
47
+ define_code_mapper_method :birth_at_era_nengo, :applied_at_era_nengo,
48
+ :old_applied_at_era_nengo, :income_updated_at_era_nengo,
49
+ :ip_type, :income_updated_type
50
+ define_in_k_method :old_monthly_standard_income_hel_ins, :old_monthly_standard_income_pns_ins
51
+
52
+ validates :prefecture_code, charset: { accept: [:numeric] }, sjis_bytesize: { is: 2 }
53
+ validates :area_code, charset: { accept: [:numeric] }, sjis_bytesize: { is: 2 }
54
+ validates :office_code, charset: { accept: %i[numeric latin katakana] }, sjis_bytesize: { in: 1..4 }
55
+ validates :ip_code, charset: { accept: [:numeric] }, sjis_bytesize: { in: 1..6 }, allow_blank: true
56
+ validates :ip_code, presence: true, if: proc { |record| record.seventy_years_and_over.nil? }
57
+ validates :ip_name_yomi, charset: { accept: [:katakana] }, sjis_bytesize: { in: 1..25 }, space_divider: { space: :half_width }
58
+ validates :ip_name, charset: { accept: [:all] }, sjis_bytesize: { in: 0..24 }, allow_blank: true, space_divider: { space: :full_width }
59
+ validates :applied_at, timeliness: { on_or_after: -> { Date.new(1989, 1, 8) }, type: :date }
60
+ validates :old_monthly_standard_income_hel_ins, numericality: { greater_than_or_equal_to: 1_000, less_than_or_equal_to: 9_999_999 }, allow_blank: true
61
+ validates :old_monthly_standard_income_pns_ins, numericality: { greater_than_or_equal_to: 1_000, less_than_or_equal_to: 9_999_999 }, allow_blank: true
62
+ validates :old_applied_at, timeliness: { on_or_after: -> { Date.new(1989, 1, 8) }, type: :date }
63
+ validates :apr_days, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 31 }
64
+ validates :may_days, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 31 }
65
+ validates :jun_days, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 31 }
66
+ COVERED_MONTHS.each do |month|
67
+ validates "#{month}_income_currency", numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }
68
+ validates "#{month}_income_goods", numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }
69
+ end
70
+ validates :avg_adjustment, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }, allow_blank: true
71
+ validates :ip_type, inclusion: { in: %i[ip_type_0 ip_type_1 ip_type_2] }
72
+ validates :retroacted_payment, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }, allow_blank: true
73
+ validates :retroacted_payment_at, timeliness: { on_or_after: -> { Date.new(1989, 1, 8) }, type: :date }, allow_blank: true
74
+ validates :income_updated_type, inclusion: { in: %i[income_updated_type_0 income_updated_type_1] }, allow_blank: true
75
+ validates :income_updated_at, timeliness: { on_or_after: -> { Date.new(1989, 1, 8) }, type: :date }, allow_blank: true
76
+ validates :my_number, charset: { accept: [:numeric] }, sjis_bytesize: { is: 12 }, allow_nil: true
77
+ validates :area_code_of_basic_pension_number, charset: { accept: [:numeric] }, sjis_bytesize: { is: 4 }, allow_nil: true
78
+ validates :serial_number_of_basic_pension_number, charset: { accept: [:numeric] }, sjis_bytesize: { is: 6 }, allow_nil: true
79
+ validates :seventy_years_and_over, inclusion: { in: [1] }, allow_nil: true
80
+ validates :seventy_years_old_months, charset: { accept: [:numeric] }, sjis_bytesize: { in: 2..4 }, allow_blank: true
81
+ validates :work_in_multiple_company, inclusion: { in: [1] }, allow_nil: true
82
+ validates :will_change_monthly_income, inclusion: { in: [1] }, allow_nil: true
83
+ validates :join_middle_of_month, inclusion: { in: [1] }, allow_nil: true
84
+ validates :leave_of_absence, inclusion: { in: [1] }, allow_nil: true
85
+ validates :short_time_worker, inclusion: { in: [1] }, allow_nil: true
86
+ validates :part_time_worker, inclusion: { in: [1] }, allow_nil: true
87
+ validates :annual_average_caluculation, inclusion: { in: [1] }, allow_nil: true
88
+ validates :memo, charset: { accept: [:all] }, sjis_bytesize: { in: 0..75 }
89
+ validates :submit_only_seventy_years_and_over, inclusion: { in: [1] }, allow_nil: true
90
+ validate :seventy_years_and_over_employee_need_to_input_my_number_or_basic_pension_number
91
+
92
+ def initialize
93
+ yield(self) if block_given?
94
+ end
95
+
96
+ # rubocop:disable all
97
+ def to_csv
98
+ [
99
+ DOC_CODE,
100
+ prefecture_code,
101
+ area_code,
102
+ office_code,
103
+ ip_code,
104
+ ip_name_yomi,
105
+ ip_name,
106
+ mapped_birth_at_era_nengo,
107
+ fmt_era_ymd_birth_at,
108
+ mapped_applied_at_era_nengo,
109
+ applied_at_era_year,
110
+ '09',
111
+ old_monthly_standard_income_hel_ins.nil? ? nil : old_monthly_standard_income_hel_ins_in_k.to_s.rjust(4, '0'),
112
+ old_monthly_standard_income_pns_ins.nil? ? nil : old_monthly_standard_income_pns_ins_in_k.to_s.rjust(4, '0'),
113
+ mapped_old_applied_at_era_nengo,
114
+ old_applied_at_era_year,
115
+ old_applied_at_month,
116
+ income_updated_at.nil? ? nil : income_updated_at_month,
117
+ mapped_income_updated_type,
118
+ retroacted_payment_at.nil? ? nil : retroacted_payment_at_month,
119
+ retroacted_payment.nil? ? nil : retroacted_payment.to_s.rjust(7, '0'),
120
+ '04',
121
+ '05',
122
+ '06',
123
+ apr_days.to_s.rjust(2, '0'),
124
+ may_days.to_s.rjust(2, '0'),
125
+ jun_days.to_s.rjust(2, '0'),
126
+ apr_income_currency.to_s.rjust(7, '0'),
127
+ may_income_currency.to_s.rjust(7, '0'),
128
+ jun_income_currency.to_s.rjust(7, '0'),
129
+ apr_income_goods.to_s.rjust(7, '0'),
130
+ may_income_goods.to_s.rjust(7, '0'),
131
+ jun_income_goods.to_s.rjust(7, '0'),
132
+ income_total(apr_income_currency, apr_income_goods).to_s.rjust(7, '0'),
133
+ income_total(may_income_currency, may_income_goods).to_s.rjust(7, '0'),
134
+ income_total(jun_income_currency, jun_income_goods).to_s.rjust(7, '0'),
135
+ income_all_total_with_round.to_s.rjust(7, '0'),
136
+ income_average.to_s.rjust(7, '0'),
137
+ avg_adjustment.nil? ? nil : avg_adjustment.to_s.rjust(7, '0'),
138
+ my_number,
139
+ area_code_of_basic_pension_number,
140
+ serial_number_of_basic_pension_number,
141
+ seventy_years_and_over,
142
+ seventy_years_old_months,
143
+ work_in_multiple_company,
144
+ will_change_monthly_income,
145
+ join_middle_of_month,
146
+ leave_of_absence,
147
+ short_time_worker,
148
+ part_time_worker,
149
+ annual_average_caluculation,
150
+ memo,
151
+ submit_only_seventy_years_and_over
152
+ ].map { |attr| attr.to_s.encode('CP932') }.join(',')
153
+ end
154
+ # rubocop:enable all
155
+
156
+ def income_total(currency, goods)
157
+ total = currency.to_i + goods.to_i
158
+ total < 10_000_000 ? total : 9_999_999
159
+ end
160
+
161
+ # 総計を計算する
162
+ # 算定対象月の合計値を返す。
163
+ def income_all_total
164
+ return 0 if target_months.empty?
165
+
166
+ target_months.map do |month|
167
+ send("#{month}_income_currency").to_i + send("#{month}_income_goods").to_i
168
+ end.inject(:+)
169
+ end
170
+
171
+ # 総計を計算する
172
+ # CSVへ出力する際、10,000,000 円以上は 9,999,999 を返す
173
+ def income_all_total_with_round
174
+ total = income_all_total
175
+ total < 10_000_000 ? total : 9_999_999
176
+ end
177
+
178
+ # 平均額を計算する
179
+ #
180
+ # 算定対象月の合計値を算定対象月数で割った値を返す。
181
+ #
182
+ # ただし、
183
+ # - 1 円未満は切り捨て
184
+ # - 10,000,000 円以上は 9,999,999 を返す
185
+ # - 算定対象月が存在しない場合は「0」を返す
186
+ def income_average
187
+ return 0 if target_months.empty?
188
+
189
+ avg = income_all_total / target_months.length
190
+ avg < 10_000_000 ? avg : 9_999_999
191
+ end
192
+
193
+ # 算定対象月の配列を返却する
194
+ #
195
+ # 1. 一般の被保険者の場合
196
+ # 17 日以上の月を対象とする
197
+ #
198
+ # 2. 短時間労働者の場合
199
+ # 11 日以上の月を対象とする
200
+ #
201
+ # 3. パートタイマーの場合
202
+ # 17 日以上の月を対象とする。
203
+ # ただし、全ての算定基礎月の支払基礎日数が 17 日未満の場合は、
204
+ # 15 日以上の月を対象とする。
205
+ def target_months
206
+ threshold = case ip_type
207
+ when :ip_type_0
208
+ 17
209
+ when :ip_type_1
210
+ COVERED_MONTHS.all? { |month| send("#{month}_days").to_i < 17 } ? 15 : 17
211
+ when :ip_type_2
212
+ 11
213
+ else
214
+ 17
215
+ end
216
+ COVERED_MONTHS.select { |month| threshold <= send("#{month}_days").to_i }
217
+ end
218
+
219
+ private
220
+
221
+ def seventy_years_and_over_employee_need_to_input_my_number_or_basic_pension_number
222
+ return if seventy_years_and_over.nil?
223
+
224
+ errors.add(:base, '70歳以上被用者の場合、マイナンバー、もしくは基礎年金番号の入力は必須です。') if my_number.nil? && area_code_of_basic_pension_number.nil? && serial_number_of_basic_pension_number.nil?
225
+ end
226
+ end
227
+ end
@@ -4,7 +4,7 @@
4
4
  module Kirico
5
5
  class DataRecord22257041 < ApplicationRecord
6
6
  DOC_CODE = '22257041'
7
- COVERED_MONTHS = %i(apr may jun).freeze
7
+ COVERED_MONTHS = %i[apr may jun].freeze
8
8
 
9
9
  attribute :area_code, String
10
10
  attribute :office_code, String
@@ -37,12 +37,12 @@ module Kirico
37
37
  define_in_k_method :old_monthly_standard_income_hel_ins, :old_monthly_standard_income_pns_ins
38
38
 
39
39
  validates :area_code, charset: { accept: [:numeric] }, sjis_bytesize: { is: 2 }
40
- validates :office_code, charset: { accept: %i(numeric latin katakana) }, sjis_bytesize: { in: 1..4 }
40
+ validates :office_code, charset: { accept: %i[numeric latin katakana] }, sjis_bytesize: { in: 1..4 }
41
41
  validates :ip_code, charset: { accept: [:numeric] }, sjis_bytesize: { in: 1..6 }
42
42
  validates :applied_at, timeliness: { on_or_after: -> { Date.new(1989, 1, 8) }, type: :date }
43
43
  validates :ip_name_yomi, charset: { accept: [:katakana] }, sjis_bytesize: { in: 1..25 }, space_divider: { space: :half_width }
44
44
  validates :ip_name, charset: { accept: [:all] }, sjis_bytesize: { in: 0..24 }, allow_blank: true, space_divider: { space: :full_width }
45
- validates :gender_type, inclusion: { in: %i(gender_type_1 gender_type_2 gender_type_3 gender_type_5 gender_type_6 gender_type_7) }
45
+ validates :gender_type, inclusion: { in: %i[gender_type_1 gender_type_2 gender_type_3 gender_type_5 gender_type_6 gender_type_7] }
46
46
  validates :old_monthly_standard_income_hel_ins, numericality: { greater_than_or_equal_to: 1_000, less_than_or_equal_to: 9_999_999 }, allow_blank: true
47
47
  validates :old_monthly_standard_income_pns_ins, numericality: { greater_than_or_equal_to: 1_000, less_than_or_equal_to: 9_999_999 }, allow_blank: true
48
48
  validates :old_applied_at, timeliness: { on_or_after: -> { Date.new(1989, 1, 8) }, type: :date }
@@ -54,9 +54,9 @@ module Kirico
54
54
  validates "#{month}_income_goods", numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }
55
55
  end
56
56
  validates :avg_adjustment, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }, allow_blank: true
57
- validates :ip_type, inclusion: { in: %i(ip_type_0 ip_type_1 ip_type_2) }
57
+ validates :ip_type, inclusion: { in: %i[ip_type_0 ip_type_1 ip_type_2] }
58
58
  validates :retroacted_payment, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }, allow_blank: true
59
- validates :income_updated_type, inclusion: { in: %i(income_updated_type_0 income_updated_type_1) }, allow_blank: true
59
+ validates :income_updated_type, inclusion: { in: %i[income_updated_type_0 income_updated_type_1] }, allow_blank: true
60
60
  validates :income_diff_amount, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 }, allow_blank: true
61
61
  validates :income_updated_at, timeliness: { on_or_after: -> { Date.new(1989, 1, 8) }, type: :date }, allow_blank: true
62
62
  validates :memo, charset: { accept: [:all] }, sjis_bytesize: { in: 0..75 }, allow_blank: true
@@ -132,6 +132,7 @@ module Kirico
132
132
  # - 算定対象月が存在しない場合は「0」を返す
133
133
  def income_average
134
134
  return 0 if target_months.empty?
135
+
135
136
  total = target_months.map do |month|
136
137
  send("#{month}_income_currency").to_i + send("#{month}_income_goods").to_i
137
138
  end.inject(:+)