lucabook 0.2.19 → 0.2.24

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 28e5bc747a4ba316a5badc9f7845637f4b27350cb199911c1cafc8771dc0925b
4
- data.tar.gz: db3d419a9a20643d2235305a6c7d0ab6f776826cd062751878b3710772b03428
3
+ metadata.gz: 55e730a696b4537183e9a298cff7d715c2a93dfa22fabc10cc889fd18c72b1a1
4
+ data.tar.gz: f5e579c528ad978533f7df60eed6b4a494dd723a4fdef15180622737fd9be32a
5
5
  SHA512:
6
- metadata.gz: b0a7ecb865541848cd4a0bcbeb7cb6e590bdba4b084a62ae656a2df7303580b7294bcc728991e41c7d2d6ef00cc068c0a6c140858126c9b2ba5d0afef4d5d68b
7
- data.tar.gz: 1fe4d3b9ce540f6424792771ed1ed9b7e40f991a281258e1b4ba415ffbab328fa148c0db917047ca5d06437c9a3126b61db2a7099bdf99b45050adda7cfa0deb
6
+ metadata.gz: 607110ed2c686b35c1be749b16bd6f4c0827450e55277d44c62ddb5acfb06fbb67d601c9fe475c453f5999afa23a1bf83923d7251ba72a7a24267e0cfc8b4057
7
+ data.tar.gz: d8fe5540370bc81494847b5f9d975667d19bda4e7979fc852556e81b2adbd644b87ca11bdf7601334454cfe545070698e0e20570895fd2e0eb4bb790eea19711
@@ -1,15 +1,17 @@
1
1
  #!/usr/bin/ruby
2
2
 
3
+ require 'json'
3
4
  require 'optparse'
4
5
  require 'luca_book'
5
6
 
6
- module LucaCmd
7
- class Journal
7
+ class LucaCmd
8
+ class Journal < LucaCmd
8
9
  def self.import(args, params)
9
10
  if params['config']
10
11
  LucaBook::Import.new(args[0], params['config']).import_csv
11
12
  elsif params['json']
12
- LucaBook::Import.import_json(STDIN.read)
13
+ str = args[0].nil? ? STDIN.read : File.read(args[0])
14
+ LucaBook::Import.import_json(str)
13
15
  else
14
16
  puts 'Usage: luca-book import -c import_config'
15
17
  exit 1
@@ -17,42 +19,69 @@ module LucaCmd
17
19
  end
18
20
 
19
21
  def self.list(args, params)
20
- args = LucaCmd.gen_range(params[:n] || 1) if args.empty?
22
+ args = gen_range(params[:n] || 1) if args.empty?
21
23
  if params['code']
22
- LucaBook::List.term(*args, code: params['code']).list_on_code.to_yaml
24
+ if params['headers']
25
+ render(LucaBook::ListByHeader.term(*args, code: params['code'], header: params['headers']).list_by_code, params)
26
+ else
27
+ render(LucaBook::List.term(*args, code: params['code']).list_by_code, params)
28
+ end
23
29
  else
24
- LucaBook::List.term(*args).list_journals.to_yaml
30
+ render(LucaBook::List.term(*args).list_journals, params)
25
31
  end
26
32
  end
27
33
 
28
34
  def self.stats(args, params)
29
- args = LucaCmd.gen_range(params[:n]) if args.empty?
30
- LucaBook::State.term(*args).stats(params[:level])
35
+ args = gen_range(params[:n]) if args.empty?
36
+ if params['code']
37
+ render(LucaBook::State.by_code(params['code'], *args), params)
38
+ else
39
+ render(LucaBook::State.range(*args).stats(params[:level]), params)
40
+ end
41
+ end
42
+
43
+ def self.add_header(args, params)
44
+ args = gen_range(params[:n] || 1) if args.empty?
45
+ if params['code']
46
+ LucaBook::List.add_header(*args, code: params['code'], header_key: params[:key], header_val: params[:value])
47
+ else
48
+ puts 'no code specified.'
49
+ end
31
50
  end
32
51
  end
33
52
 
34
- class Report
53
+ class Report < LucaCmd
35
54
  def self.balancesheet(args, params)
36
55
  level = params[:level] || 3
37
56
  legal = params[:legal] || false
38
- args = LucaCmd.gen_range(params[:n] || 1) if args.empty?
39
- LucaBook::State.term(*args).bs(level, legal: legal)
57
+ args = gen_range(params[:n] || 1) if args.empty?
58
+ render(LucaBook::State.range(*args).bs(level, legal: legal), params)
40
59
  end
41
60
 
42
61
  def self.profitloss(args, params)
43
- args = LucaCmd.gen_range(params[:n]) if args.empty?
44
- LucaBook::State.term(*args).pl.to_yaml
62
+ level = params[:level] || 2
63
+ args = gen_range(params[:n]) if args.empty?
64
+ render(LucaBook::State.range(*args).pl(level), params)
45
65
  end
46
66
  end
47
67
 
48
- module_function
49
-
50
- def gen_range(count)
68
+ def self.gen_range(count)
51
69
  count ||= 3
52
70
  today = Date.today
53
71
  start = today.prev_month(count - 1)
54
72
  [start.year, start.month, today.year, today.month]
55
73
  end
74
+
75
+ def self.render(dat, params)
76
+ case params[:output]
77
+ when 'json'
78
+ puts JSON.dump(dat)
79
+ when 'nu'
80
+ LucaSupport::View.nushell(YAML.dump(dat))
81
+ else
82
+ puts YAML.dump(dat)
83
+ end
84
+ end
56
85
  end
57
86
 
58
87
  def new_pj(args = nil, params = {})
@@ -79,15 +108,31 @@ when /journals?/, 'j'
79
108
  OptionParser.new do |opt|
80
109
  opt.banner = 'Usage: luca-book journals list [options] [YYYY M]'
81
110
  opt.on('-c', '--code VAL', 'search with code') { |v| params['code'] = v }
111
+ opt.on('--customer', 'categorize by x-customer header') { |_v| params['headers'] = 'x-customer' }
82
112
  opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
113
+ opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
114
+ opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
83
115
  opt.on_tail('List records. If you specify code and/or month, search on each criteria.')
84
116
  args = opt.parse!(ARGV)
85
117
  LucaCmd::Journal.list(args, params)
86
118
  end
119
+ when 'set'
120
+ OptionParser.new do |opt|
121
+ opt.banner = 'Usage: luca-book journals set [options] [YYYY M]'
122
+ opt.on('-c', '--code VAL', 'search with code') { |v| params['code'] = v }
123
+ opt.on('--header VAL', 'header key') { |v| params[:key] = v }
124
+ opt.on('--val VAL', 'header value') { |v| params[:value] = v }
125
+ opt.on_tail('set header to journals on specified code.')
126
+ args = opt.parse!(ARGV)
127
+ LucaCmd::Journal.add_header(args, params)
128
+ end
87
129
  when 'stats'
88
130
  OptionParser.new do |opt|
89
131
  opt.banner = 'Usage: luca-book journals stats [options] [YYYY M]'
132
+ opt.on('-c', '--code VAL', 'search with code') { |v| params['code'] = v }
90
133
  opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
134
+ opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
135
+ opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
91
136
  args = opt.parse!(ARGV)
92
137
  LucaCmd::Journal.stats(args, params)
93
138
  end
@@ -115,13 +160,18 @@ when /reports?/, 'r'
115
160
  opt.banner = 'Usage: luca-book reports bs [options] [YYYY M]'
116
161
  opt.on('-l', '--level VAL', 'account level') { |v| params[:level] = v.to_i }
117
162
  opt.on('--legal', 'show legal mandatory account') { |_v| params[:legal] = true }
163
+ opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
164
+ opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
118
165
  args = opt.parse!(ARGV)
119
166
  LucaCmd::Report.balancesheet(args, params)
120
167
  end
121
168
  when 'pl'
122
169
  OptionParser.new do |opt|
123
170
  opt.banner = 'Usage: luca-book reports pl [options] [YYYY M YYYY M]'
171
+ opt.on('-l', '--level VAL', 'account level') { |v| params[:level] = v.to_i }
124
172
  opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
173
+ opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
174
+ opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
125
175
  args = opt.parse!(ARGV)
126
176
  LucaCmd::Report.profitloss(args, params)
127
177
  end
@@ -9,6 +9,7 @@ module LucaBook
9
9
  autoload :Import, 'luca_book/import'
10
10
  autoload :Journal, 'luca_book/journal'
11
11
  autoload :List, 'luca_book/list'
12
+ autoload :ListByHeader, 'luca_book/list_by_header'
12
13
  autoload :Setup, 'luca_book/setup'
13
14
  autoload :State, 'luca_book/state'
14
15
  autoload :Util, 'luca_book/util'
@@ -49,7 +49,7 @@ class LucaBookConsole
49
49
  print " " if h[:code].length > 3
50
50
  end
51
51
  puts cnsl_label(h[:label], h[:code])
52
- h[:value].each_slice(6) do |v|
52
+ h[:amount].each_slice(6) do |v|
53
53
  puts "#{cnsl_fmt("", 14)} #{v.map{|v| cnsl_fmt(v, 14)}.join}"
54
54
  end
55
55
  end
@@ -72,13 +72,13 @@ class LucaBookConsole
72
72
  end
73
73
  convert_collection(report).each do |h|
74
74
  if /^[A-Z]/.match(h[:code])
75
- total = [h[:value].inject(:+)] + Array.new(h[:value].length)
75
+ total = [h[:amount].inject(:+)] + Array.new(h[:amount].length)
76
76
  if /[^0]$/.match(h[:code])
77
77
  print " "
78
78
  print " " if h[:code].length > 3
79
79
  end
80
80
  puts cnsl_label(h[:label], h[:code])
81
- h[:value].each_slice(6).with_index(0) do |v, i|
81
+ h[:amount].each_slice(6).with_index(0) do |v, i|
82
82
  puts "#{cnsl_fmt(total[i], 14)} #{v.map{|v| cnsl_fmt(v, 14)}.join}"
83
83
  end
84
84
  end
@@ -98,7 +98,7 @@ class LucaBookConsole
98
98
  end
99
99
  end
100
100
  }.sort.map do |k,v|
101
- {code: k, label: @report.dict.dig(k, :label), value: v}
101
+ {code: k, label: @report.dict.dig(k, :label), amount: v}
102
102
  end
103
103
  end
104
104
 
@@ -7,8 +7,85 @@ require 'pathname'
7
7
 
8
8
  module LucaBook
9
9
  class Dict < LucaRecord::Dict
10
+ # Column number settings for CSV/TSV convert
11
+ #
12
+ # :label
13
+ # for double entry data
14
+ # :counter_label
15
+ # must be specified with label
16
+ # :debit_label
17
+ # for double entry data
18
+ # * debit_amount
19
+ # :credit_label
20
+ # for double entry data
21
+ # * credit_amount
22
+ # :note
23
+ # can be the same column as another label
24
+ #
25
+ # :encoding
26
+ # file encoding
27
+ #
28
+ def csv_config
29
+ {}.tap do |config|
30
+ if @config.dig('label')
31
+ config[:label] = @config['label'].to_i
32
+ if @config.dig('counter_label')
33
+ config[:counter_label] = @config['counter_label']
34
+ config[:type] = 'single'
35
+ end
36
+ elsif @config.dig('debit_label')
37
+ config[:debit_label] = @config['debit_label'].to_i
38
+ if @config.dig('credit_label')
39
+ config[:credit_label] = @config['credit_label'].to_i
40
+ config[:type] = 'double'
41
+ end
42
+ end
43
+ config[:type] ||= 'invalid'
44
+ config[:debit_amount] = @config['debit_amount'].to_i if @config.dig('debit_amount')
45
+ config[:credit_amount] = @config['credit_amount'].to_i if @config.dig('credit_amount')
46
+ config[:note] = @config['note'] if @config.dig('note')
47
+ config[:encoding] = @config['encoding'] if @config.dig('encoding')
48
+
49
+ config[:year] = @config['year'] if @config.dig('year')
50
+ config[:month] = @config['month'] if @config.dig('month')
51
+ config[:day] = @config['day'] if @config.dig('day')
52
+ config[:default_debit] = @config['default_debit'] if @config.dig('default_debit')
53
+ config[:default_credit] = @config['default_credit'] if @config.dig('default_credit')
54
+ end
55
+ end
56
+
57
+ def search(word, default_word = nil, amount = nil)
58
+ res = super(word, default_word, main_key: 'account_label')
59
+ if res.is_a?(Array) && res[0].is_a?(Array)
60
+ filter_amount(res, amount)
61
+ else
62
+ res
63
+ end
64
+ end
65
+
66
+ # Choose setting on Big or small condition.
67
+ #
68
+ def filter_amount(settings, amount = nil)
69
+ return settings[0] if amount.nil?
70
+
71
+ settings.each do |item|
72
+ return item unless item[1].keys.include?(:on_amount)
73
+
74
+ condition = item.dig(1, :on_amount)
75
+ case condition[0]
76
+ when '>'
77
+ return item if amount > BigDecimal(condition[1..])
78
+ when '<'
79
+ return item if amount < BigDecimal(condition[1..])
80
+ else
81
+ return item
82
+ end
83
+ end
84
+ nil
85
+ end
86
+
10
87
  def self.latest_balance
11
- dict_dir = Pathname(LucaSupport::Config::Pjdir) / 'data' / 'balance'
88
+ dict_dir = Pathname(LucaSupport::PJDIR) / 'data' / 'balance'
12
89
  # TODO: search latest balance dictionary
13
90
  load_tsv_dict(dict_dir / 'start.tsv')
14
91
  end
@@ -4,9 +4,14 @@ require 'date'
4
4
  require 'json'
5
5
  require 'luca_book'
6
6
  require 'luca_support'
7
- #require 'luca_book/dict'
8
7
  require 'luca_record'
9
8
 
9
+ begin
10
+ require "luca_book/import_#{LucaSupport::CONFIG['country']}"
11
+ rescue LoadError => e
12
+ e.message
13
+ end
14
+
10
15
  module LucaBook
11
16
  class Import
12
17
  DEBIT_DEFAULT = '10XX'
@@ -18,7 +23,7 @@ module LucaBook
18
23
  @target_file = path
19
24
  # TODO: yaml need to be configurable
20
25
  @dict_name = dict
21
- @dict = LucaRecord::Dict.new("import-#{dict}.yaml")
26
+ @dict = LucaBook::Dict.new("import-#{dict}.yaml")
22
27
  @code_map = LucaRecord::Dict.reverse(LucaRecord::Dict.load('base.tsv'))
23
28
  @config = @dict.csv_config if dict
24
29
  end
@@ -30,13 +35,13 @@ module LucaBook
30
35
  # "debit" : [
31
36
  # {
32
37
  # "label": "savings accounts",
33
- # "value": 20000
38
+ # "amount": 20000
34
39
  # }
35
40
  # ],
36
41
  # "credit" : [
37
42
  # {
38
43
  # "label": "trade notes receivable",
39
- # "value": 20000
44
+ # "amount": 20000
40
45
  # }
41
46
  # ],
42
47
  # "note": "settlement for the last month trade"
@@ -45,8 +50,6 @@ module LucaBook
45
50
  #
46
51
  def self.import_json(io)
47
52
  JSON.parse(io).each do |d|
48
- validate(d)
49
-
50
53
  code_map = LucaRecord::Dict.reverse(LucaRecord::Dict.load('base.tsv'))
51
54
  d['debit'].each { |h| h['code'] = code_map.dig(h['label']) || DEBIT_DEFAULT }
52
55
  d['credit'].each { |h| h['code'] = code_map.dig(h['label']) || CREDIT_DEFAULT }
@@ -67,46 +70,41 @@ module LucaBook
67
70
  end
68
71
  end
69
72
 
70
- def self.validate(obj)
71
- raise 'NoDateKey' unless obj.key?('date')
72
- raise 'NoDebitKey' unless obj.key?('debit')
73
- raise 'NoDebitValue' if obj['debit'].empty?
74
- raise 'NoCreditKey' unless obj.key?('credit')
75
- raise 'NoCreditValue' if obj['credit'].empty?
76
- end
77
-
78
73
  private
79
74
 
80
- #
81
75
  # convert single entry data
82
76
  #
83
77
  def parse_single(row)
84
- value = row.dig(@config[:credit_value])&.empty? ? row[@config[:debit_value]] : row[@config[:credit_value]]
78
+ if (row.dig(@config[:credit_amount]) || []).empty?
79
+ amount = BigDecimal(row[@config[:debit_amount]])
80
+ debit = true
81
+ else
82
+ amount = BigDecimal(row[@config[:credit_amount]])
83
+ end
84
+ default_label = debit ? @config.dig(:default_debit) : @config.dig(:default_credit)
85
+ code, options = search_code(row[@config[:label]], default_label, amount)
86
+ counter_code = @code_map.dig(@config[:counter_label])
87
+ if options
88
+ x_customer = options[:'x-customer'] if options[:'x-customer']
89
+ data, data_c = tax_extension(code, counter_code, amount, options) if respond_to? :tax_extension
90
+ end
91
+ data ||= [{ 'code' => code, 'amount' => amount }]
92
+ data_c ||= [{ 'code' => counter_code, 'amount' => amount }]
85
93
  {}.tap do |d|
86
94
  d['date'] = parse_date(row)
87
- if row.dig(@config[:credit_value])&.empty?
88
- d['debit'] = [
89
- { 'code' => search_code(row[@config[:label]], @config.dig(:default_debit)) || DEBIT_DEFAULT }
90
- ]
91
- d['credit'] = [
92
- { 'code' => @code_map.dig(@config[:counter_label]) }
93
- ]
95
+ if debit
96
+ d['debit'] = data
97
+ d['credit'] = data_c
94
98
  else
95
- d['debit'] = [
96
- { 'code' => @code_map.dig(@config[:counter_label]) }
97
- ]
98
- d['credit'] = [
99
- { 'code' => search_code(row[@config[:label]], @config.dig(:default_credit)) || CREDIT_DEFAULT }
100
- ]
99
+ d['debit'] = data_c
100
+ d['credit'] = data
101
101
  end
102
- d['debit'][0]['value'] = value
103
- d['credit'][0]['value'] = value
104
102
  d['note'] = Array(@config[:note]).map{ |col| row[col] }.join(' ')
105
- d['x-editor'] = "LucaBook::Import/#{@dict_name}"
103
+ d['headers'] = { 'x-editor' => "LucaBook::Import/#{@dict_name}" }
104
+ d['headers']['x-customer'] = x_customer if x_customer
106
105
  end
107
106
  end
108
107
 
109
- #
110
108
  # convert double entry data
111
109
  #
112
110
  def parse_double(row)
@@ -114,19 +112,20 @@ module LucaBook
114
112
  d['date'] = parse_date(row)
115
113
  d['debit'] = {
116
114
  'code' => search_code(row[@config[:label]], @config.dig(:default_debit)) || DEBIT_DEFAULT,
117
- 'value' => row.dig(@config[:debit_value])
115
+ 'amount' => row.dig(@config[:debit_amount])
118
116
  }
119
117
  d['credit'] = {
120
118
  'code' => search_code(row[@config[:label]], @config.dig(:default_credit)) || CREDIT_DEFAULT,
121
- 'value' => row.dig(@config[:credit_value])
119
+ 'amount' => row.dig(@config[:credit_amount])
122
120
  }
123
121
  d['note'] = Array(@config[:note]).map{ |col| row[col] }.join(' ')
124
122
  d['x-editor'] = "LucaBook::Import/#{@dict_name}"
125
123
  end
126
124
  end
127
125
 
128
- def search_code(label, default_label)
129
- @code_map.dig(@dict.search(label, default_label))
126
+ def search_code(label, default_label, amount = nil)
127
+ label, options = @dict.search(label, default_label, amount)
128
+ [@code_map.dig(label), options]
130
129
  end
131
130
 
132
131
  def parse_date(row)
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'luca_book'
5
+ require 'luca_support'
6
+
7
+ module LucaBook
8
+ class Import
9
+ # TODO: need to be separated into pluggable l10n module.
10
+ # TODO: gensen rate >1m yen.
11
+ # TODO: gensen & consumption `round()` rules need to be confirmed.
12
+ # Profit or Loss account should be specified as code1.
13
+ #
14
+ def tax_extension(code1, code2, amount, options)
15
+ return nil if options.nil? || options[:tax_options].nil?
16
+ return nil if !options[:tax_options].include?('jp-gensen') && !options[:tax_options].include?('jp-consumption')
17
+
18
+ gensen_rate = BigDecimal('0.1021')
19
+ consumption_rate = BigDecimal('0.1')
20
+ gensen_code = @code_map.dig(options[:gensen_label]) || @code_map.dig('預り金')
21
+ gensen_idx = /^[5-8B-G]/.match(code1) ? 1 : 0
22
+ consumption_idx = /^[A-G]/.match(code1) ? 0 : 1
23
+ consumption_code = @code_map.dig(options[:consumption_label])
24
+ consumption_code ||= /^[A]/.match(code1) ? @code_map.dig('仮受消費税等') : @code_map.dig('仮払消費税等')
25
+ if options[:tax_options].include?('jp-gensen') && options[:tax_options].include?('jp-consumption')
26
+ paid_rate = BigDecimal('1') + consumption_rate - gensen_rate
27
+ gensen_amount = (amount / paid_rate * gensen_rate).round
28
+ consumption_amount = (amount / paid_rate * consumption_rate).round
29
+ [].tap do |res|
30
+ res << [].tap do |res1|
31
+ amount1 = amount
32
+ amount1 -= consumption_amount if consumption_idx == 0
33
+ amount1 += gensen_amount if gensen_idx == 1
34
+ res1 << { 'code' => code1, 'amount' => amount1 }
35
+ res1 << { 'code' => consumption_code, 'amount' => consumption_amount } if consumption_idx == 0
36
+ res1 << { 'code' => gensen_code, 'amount' => gensen_amount } if gensen_idx == 0
37
+ end
38
+ res << [].tap do |res2|
39
+ amount2 = amount
40
+ amount2 -= consumption_amount if consumption_idx == 1
41
+ amount2 += gensen_amount if gensen_idx == 0
42
+ res2 << { 'code' => code2, 'amount' => amount2 }
43
+ res2 << { 'code' => consumption_code, 'amount' => consumption_amount } if consumption_idx == 1
44
+ res2 << { 'code' => gensen_code, 'amount' => gensen_amount } if gensen_idx == 1
45
+ end
46
+ end
47
+ elsif options[:tax_options].include?('jp-gensen')
48
+ paid_rate = BigDecimal('1') - gensen_rate
49
+ gensen_amount = (amount / paid_rate * gensen_rate).round
50
+ [].tap do |res|
51
+ res << [].tap do |res1|
52
+ amount1 = amount
53
+ amount1 += gensen_amount if gensen_idx == 1
54
+ res1 << { 'code' => code, 'amount' => amount1 }
55
+ res1 << { 'code' => gensen_code, 'amount' => gensen_amount } if gensen_idx == 0
56
+ end
57
+ res << [].tap do |res2|
58
+ amount2 = amount
59
+ amount2 += gensen_amount if gensen_idx == 0
60
+ mount2 ||= amount
61
+ res2 << { 'code' => code2, 'amount' => amount2 }
62
+ res2 << { 'code' => gensen_code, 'amount' => gensen_amount } if gensen_idx == 1
63
+ end
64
+ end
65
+ elsif options[:tax_options].include?('jp-consumption')
66
+ paid_rate = BigDecimal('1') + consumption_rate - gensen_rate
67
+ consumption_amount = (amount / paid_rate * consumption_rate).round
68
+ res << [].tap do |res1|
69
+ amount1 = amount
70
+ amount1 -= consumption_amount if consumption_idx == 0
71
+ res1 << { 'code' => code1, 'amount' => amount1 }
72
+ res1 << { 'code' => consumption_code, 'amount' => consumption_amount } if consumption_idx == 0
73
+ end
74
+ res << [].tap do |res2|
75
+ amount2 = amount
76
+ amount2 -= consumption_amount if consumption_idx == 1
77
+ res2 << { 'code' => code2, 'amount' => amount2 }
78
+ res2 << { 'code' => consumption_code, 'amount' => consumption_amount } if consumption_idx == 1
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end