cnab_rb 0.1.0 → 0.1.1

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: 9668b76dddf165eb9f41fc2ef951f86b99f7f6a79fcc2b11ab1b522b316917b6
4
- data.tar.gz: 6b6ecc7e01022ebbff08954eaa6e43400b63599d97a9c19e71170f19a4817522
3
+ metadata.gz: d125b4600942c6b69ac39a1258d3f16e08e7365a46bd613e4bdcf3e520f33a11
4
+ data.tar.gz: c06a22ec4306e80703e7f8b712ac9bb96d419ef341be462c8b31cfc8091cd29a
5
5
  SHA512:
6
- metadata.gz: 3a182e807ec9acd97b4178875b286a3171cb1bcf716a562fb40161b3813df7589668ed5463ef49e60da5347b79e08cbfe1135e2f73e68481b582ccdb00179707
7
- data.tar.gz: bb3a3d765ec2c4c1e0fd4da07fe13284b2cccb9cc9a613f5cbf2f4cb6140bfa79d6ba410a46c6dde5c09e4a5b6487742c6cb4ea2793cfb2ec956c12c4ea2f88c
6
+ metadata.gz: cc2df7ccf2bc907830033a59d68d47acda402fb38a7b81808b399381453cf947e46df5fc742d5dd5a231eefe8b3bcc57a3555b53acaa243bb2a8ed5f9fdbe65e
7
+ data.tar.gz: b9fbd01403a202db938b1351e6e723c45cf073e88efa9c6908dfe62f858afb095ec557254d5b7d2d877a104a06fd3046bc47e422e607adc6b8f7aa25cde9fb30
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cnab_rb (0.1.0)
4
+ cnab_rb (0.1.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # CnabRb
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/cnab_rb`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ Project to create and read CNAB files
6
4
 
7
5
  ## Installation
8
6
 
@@ -22,7 +20,24 @@ Or install it yourself as:
22
20
 
23
21
  ## Usage
24
22
 
25
- TODO: Write usage instructions here
23
+ Read return files:
24
+
25
+ ```ruby
26
+ require 'cnab_rb'
27
+
28
+ factory = CnabRb::Return::ReturnFactory.new
29
+ file = factory.make_return('path/to/file.ret')
30
+
31
+ file.details.each do |detail|
32
+ received_amount = detail.net_amount
33
+ is_write_off = detail.is_write_off
34
+ our_number = detail.our_number
35
+
36
+ if is_write_off && received_amount
37
+ # your title is paid
38
+ end
39
+ end
40
+ ```
26
41
 
27
42
  ## Development
28
43
 
data/lib/cnab_rb.rb CHANGED
@@ -20,10 +20,9 @@ module CnabRb
20
20
  module Cnab240
21
21
  module Generic
22
22
  module Return
23
- autoload :SegmentA, 'cnab_rb/layouts/cnab240/generic/segment_a'
24
- autoload :SegmentT, 'cnab_rb/layouts/cnab240/generic/segment_t'
25
- autoload :SegmentU, 'cnab_rb/layouts/cnab240/generic/segment_u'
26
- autoload :SegmentW, 'cnab_rb/layouts/cnab240/generic/segment_w'
23
+ autoload :SegmentT, 'cnab_rb/layouts/cnab240/generic/return/segment_t'
24
+ autoload :SegmentU, 'cnab_rb/layouts/cnab240/generic/return/segment_u'
25
+ autoload :SegmentW, 'cnab_rb/layouts/cnab240/generic/return/segment_w'
27
26
  end
28
27
 
29
28
  autoload :HeaderFile, 'cnab_rb/layouts/cnab240/generic/header_file'
@@ -36,6 +35,13 @@ module CnabRb
36
35
  end
37
36
 
38
37
  module Return
38
+ module Cnab240
39
+ autoload :GenericReturn, 'cnab_rb/return/cnab240/generic_return'
40
+ autoload :Batch, 'cnab_rb/return/cnab240/batch'
41
+ autoload :Detail, 'cnab_rb/return/cnab240/detail'
42
+ autoload :CaixaReturn, 'cnab_rb/return/cnab240/caixa_return'
43
+ end
44
+
39
45
  autoload :ReturnFactory, 'cnab_rb/return/return_factory'
40
46
  end
41
47
  end
@@ -36,8 +36,8 @@ module CnabRb::Format
36
36
  def decode(value)
37
37
  decoded = @picture.decode(value)
38
38
 
39
- unless @date_format.nil?
40
- DateTime.strptime(decoded.to_s, @date_format)
39
+ unless @date_format.nil? || decoded == 0
40
+ DateTime.strptime(decoded.to_s.rjust(length, '0'), @date_format)
41
41
  else
42
42
  decoded
43
43
  end
@@ -15,10 +15,14 @@ module CnabRb::Format
15
15
  def decode(text)
16
16
  @lines = text.split(LINE_BREAK).map do |line_text|
17
17
  layout = get_line_layout(line_text)
18
- line = Line.new(layout)
19
- line.decode(line_text)
20
- line
18
+ unless layout.nil?
19
+ line = Line.new(layout)
20
+ line.decode(line_text)
21
+ line
22
+ end
21
23
  end
24
+
25
+ @lines = @lines.filter {|n| !n.nil?}
22
26
  end
23
27
 
24
28
  def get_line_layout(line_text)
@@ -45,5 +45,9 @@ module CnabRb::Format
45
45
 
46
46
  return false
47
47
  end
48
+
49
+ def field_exists(field_name)
50
+ @attributes.key? field_name.to_sym
51
+ end
48
52
  end
49
53
  end
@@ -9,7 +9,6 @@ module CnabRb::Format
9
9
  length_decimal = length_decimal.to_i
10
10
  end
11
11
 
12
-
13
12
  if 'X' == type
14
13
  @format = PictureFormats::Text.new(length)
15
14
  elsif ('9' == type and length_decimal.nil?)
@@ -24,7 +24,7 @@ module CnabRb::Format::PictureFormats
24
24
  end
25
25
 
26
26
  def length
27
- @length_left + @length_right
27
+ @format_left.length + @length_right
28
28
  end
29
29
  end
30
30
  end
@@ -1,5 +1,5 @@
1
1
  module CnabRb::Layouts::Cnab240::Generic
2
- class HeaderFile < CnabRb::Layouts::Layout
2
+ class HeaderBatch < CnabRb::Layouts::Layout
3
3
  def init_fields
4
4
  field :bank_code,
5
5
  # codigo_banco
@@ -164,10 +164,10 @@ module CnabRb::Layouts::Cnab240::Generic
164
164
  # Número seqüencial adotado e controlado pelo responsável pela geração do arquivo para ordenar a
165
165
  # disposição dos arquivos encaminhados.
166
166
  # Evoluir um número seqüencial a cada header de arquivo.
167
- pos: [158, 163],
167
+ pos: 158..163,
168
168
  picture: '9(6)'
169
169
 
170
- file :layout_version,
170
+ field :layout_version,
171
171
  # Código adotado pela FEBRABAN para identificar qual a versão de layout do arquivo encaminhado. O
172
172
  # código é composto de:
173
173
  # Versão = 2 dígitos
@@ -177,7 +177,7 @@ module CnabRb::Layouts::Cnab240::Generic
177
177
  picture: '9(3)',
178
178
  default: '030'
179
179
 
180
- file :density_file,
180
+ field :density_file,
181
181
  # Densidade de gravação (bpi), do arquivo encaminhado. Pode ser:
182
182
  # 1600 BPI
183
183
  # 6250 BPI
@@ -201,7 +201,7 @@ module CnabRb::Layouts::Cnab240::Generic
201
201
  picture: 'X(20)',
202
202
  default: 'REMESSA-PRODUCAO'
203
203
 
204
- field :exclusive_use_febraban_2,
204
+ field :exclusive_use_febraban_3,
205
205
  # Texto de observações destinado para uso exclusivo da FEBRABAN. Preencher com Brancos.
206
206
  pos: 212..240,
207
207
  picture: 'X(29)',
@@ -36,7 +36,7 @@ module CnabRb::Layouts::Cnab240::Generic::Return
36
36
  pos: 16..17,
37
37
  picture: '9(2)'
38
38
 
39
- field :mantainer_agency,
39
+ field :agency,
40
40
  # agencia_mantenedora
41
41
  pos: 18..22,
42
42
  picture: '9(5)'
@@ -29,7 +29,7 @@ module CnabRb::Layouts
29
29
  end
30
30
 
31
31
  if expected_line_length != actual_line_length
32
- raise CnabRb::Error.new("Invalid layout length, expected #{expected_line_length}, actual #{actual_line_length}")
32
+ raise CnabRb::Error.new("Invalid layout length, expected #{expected_line_length}, actual #{actual_line_length}, layout: #{self.class}")
33
33
  end
34
34
  end
35
35
 
@@ -0,0 +1,41 @@
1
+ module CnabRb::Return::Cnab240
2
+ class Batch
3
+ attr_accessor :segments, :header, :trailer
4
+
5
+ def initialize
6
+ @segments = []
7
+ end
8
+
9
+ def details
10
+ unless @details.nil?
11
+ return @details
12
+ end
13
+
14
+ lastDetail = nil
15
+ @details = []
16
+
17
+ @segments.each do |s|
18
+ if s.segment_code == 'T'
19
+ lastDetail = Detail.new
20
+ @details << lastDetail
21
+ end
22
+
23
+ unless lastDetail.nil?
24
+ if s.segment_code == 'T'
25
+ lastDetail.segment_t = s
26
+ end
27
+
28
+ if s.segment_code == 'U'
29
+ lastDetail.segment_u = s
30
+ end
31
+
32
+ if s.segment_code == 'W'
33
+ lastDetail.segment_w = s
34
+ end
35
+ end
36
+ end
37
+
38
+ @details
39
+ end
40
+ end
41
+ end
@@ -1,4 +1,4 @@
1
1
  module CnabRb::Return::Cnab240
2
- class CaixaReturn < Cnab::Return::Cnab240::GenericReturn
2
+ class CaixaReturn < CnabRb::Return::Cnab240::GenericReturn
3
3
  end
4
4
  end
@@ -0,0 +1,103 @@
1
+ module CnabRb::Return::Cnab240
2
+ class Detail
3
+ attr_accessor :segment_t, :segment_u, :segment_w
4
+
5
+ def is_write_off
6
+ [6, 9, 17, 25].include?(@segment_t.movement_code)
7
+ end
8
+
9
+ def is_rejected_write_off
10
+ [3, 26, 30].include?(@segment_t.movement_code)
11
+ end
12
+
13
+ def movement_code
14
+ @segment_t.movement_code
15
+ end
16
+
17
+ def net_amount
18
+ @segment_u.net_amount
19
+ end
20
+
21
+ def title_amount
22
+ @segment_t.title_amount
23
+ end
24
+
25
+ def paid_amount
26
+ @segment_u.paid_amount
27
+ end
28
+
29
+ def tax_amount
30
+ @segment_t.tax_amount
31
+ end
32
+
33
+ def iof_amount
34
+ @segment_u.iof_amount
35
+ end
36
+
37
+ def discount_amount
38
+ @segment_u.discount_amount
39
+ end
40
+
41
+ def abatement_amount
42
+ @segment_u.abatement_amount
43
+ end
44
+
45
+ def other_expenses_amount
46
+ @segment_u.other_expenses_amount
47
+ end
48
+
49
+ def other_credits_amount
50
+ @segment_u.other_credits_amount
51
+ end
52
+
53
+ def document_number
54
+ @segment_t.document_number
55
+ end
56
+
57
+ def our_number
58
+ @segment_t.our_number
59
+ end
60
+
61
+ def due_date
62
+ @segment_t.due_date
63
+ end
64
+
65
+ def credit_date
66
+ @segment_u.credit_date
67
+ end
68
+
69
+ def fine_amount
70
+ @segment_u.additions_amount
71
+ end
72
+
73
+ def ocurrency_date
74
+ @segment_u.ocurrency_date
75
+ end
76
+
77
+ def wallet_code
78
+ if @segment_t.field_exists(:wallet_code)
79
+ @segment_t.wallet_code
80
+ end
81
+ end
82
+
83
+ def agency
84
+ @segment_t.agency
85
+ end
86
+
87
+ def agency_cd
88
+ @segment_t.agency_cd
89
+ end
90
+
91
+ def collector_agency
92
+ @segment_t.collector_agency
93
+ end
94
+
95
+ def collector_agency_cd
96
+ @segment_t.collector_agency_cd
97
+ end
98
+
99
+ def sequential_number
100
+ @segment_t.sequential_number_batch
101
+ end
102
+ end
103
+ end
@@ -1,4 +1,96 @@
1
1
  module CnabRb::Return::Cnab240
2
- class GenericReturn < Cnab::Format::File
2
+ class GenericReturn < CnabRb::Format::File
3
+ def get_line_layout(line_text)
4
+ registry_type_table = {
5
+ '0' => :header_file,
6
+ '1' => :header_batch,
7
+ '3' => :segment,
8
+ '5' => :trailer_batch,
9
+ '9' => :trailer_file
10
+ }
11
+
12
+ registry_type = registry_type_table[line_text[7, 1]]
13
+ segment_code = line_text[13, 1]
14
+
15
+ unless registry_type.nil?
16
+ if :segment == registry_type
17
+ method_name = "segment_#{segment_code.downcase}_layout"
18
+ else
19
+ method_name = "#{registry_type}_layout"
20
+ end
21
+
22
+ if respond_to?(method_name)
23
+ send(method_name)
24
+ end
25
+ end
26
+ end
27
+
28
+ def header_file_layout
29
+ CnabRb::Layouts::Cnab240::Generic::HeaderFile.new
30
+ end
31
+
32
+ def header_batch_layout
33
+ CnabRb::Layouts::Cnab240::Generic::HeaderBatch.new
34
+ end
35
+
36
+ def segment_t_layout
37
+ CnabRb::Layouts::Cnab240::Generic::Return::SegmentT.new
38
+ end
39
+
40
+ def segment_u_layout
41
+ CnabRb::Layouts::Cnab240::Generic::Return::SegmentU.new
42
+ end
43
+
44
+ def segment_w_layout
45
+ CnabRb::Layouts::Cnab240::Generic::Return::SegmentW.new
46
+ end
47
+
48
+ def trailer_batch_layout
49
+ CnabRb::Layouts::Cnab240::Generic::TrailerBatch.new
50
+ end
51
+
52
+ def trailer_file_layout
53
+ CnabRb::Layouts::Cnab240::Generic::TrailerFile.new
54
+ end
55
+
56
+ def batches
57
+ unless @batches.nil?
58
+ return @batches
59
+ end
60
+
61
+ lastBatch = nil
62
+ @batches = []
63
+
64
+ @lines.each do |line|
65
+ if line.registry_type == 1
66
+ lastBatch = Batch.new
67
+ @batches.push(lastBatch)
68
+ end
69
+
70
+ unless lastBatch.nil?
71
+ if line.registry_type == 1
72
+ lastBatch.header = line
73
+ end
74
+
75
+ if line.registry_type == 3
76
+ lastBatch.segments << line
77
+ end
78
+
79
+ if line.registry_type == 5
80
+ lastBatch.trailer = line
81
+ end
82
+ end
83
+ end
84
+
85
+ @batches
86
+ end
87
+
88
+ def details
89
+ unless @details.nil?
90
+ return @details
91
+ end
92
+
93
+ @details = batches.map{|b| b.details}.flatten
94
+ end
3
95
  end
4
96
  end
@@ -2,7 +2,7 @@ module CnabRb::Return
2
2
  class ReturnFactory
3
3
  def make_return(file_name)
4
4
  first_line = File.open(file_name, &:readline)
5
- format = first_line.gsub(/(\r|\n)$/, '').length
5
+ format = first_line.gsub(/(\r|\n)/, '').length
6
6
  bank_code = first_line[0, 3]
7
7
  method = "make_cnab#{format}_#{bank_code}"
8
8
 
@@ -14,6 +14,9 @@ module CnabRb::Return
14
14
  end
15
15
 
16
16
  def make_cnab240_104(file_name)
17
+ file = CnabRb::Return::Cnab240::CaixaReturn.new
18
+ file.decode(File.read(file_name))
19
+ file
17
20
  end
18
21
  end
19
22
  end
@@ -1,3 +1,3 @@
1
1
  module CnabRb
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cnab_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anderson Danilo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-28 00:00:00.000000000 Z
11
+ date: 2019-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -81,14 +81,15 @@ files:
81
81
  - lib/cnab_rb/format/picture_formats/text.rb
82
82
  - lib/cnab_rb/layouts/cnab240/generic/header_batch.rb
83
83
  - lib/cnab_rb/layouts/cnab240/generic/header_file.rb
84
- - lib/cnab_rb/layouts/cnab240/generic/return/segment_a.rb
85
84
  - lib/cnab_rb/layouts/cnab240/generic/return/segment_t.rb
86
85
  - lib/cnab_rb/layouts/cnab240/generic/return/segment_u.rb
87
86
  - lib/cnab_rb/layouts/cnab240/generic/return/segment_w.rb
88
87
  - lib/cnab_rb/layouts/cnab240/generic/trailer_batch.rb
89
88
  - lib/cnab_rb/layouts/cnab240/generic/trailer_file.rb
90
89
  - lib/cnab_rb/layouts/layout.rb
90
+ - lib/cnab_rb/return/cnab240/batch.rb
91
91
  - lib/cnab_rb/return/cnab240/caixa_return.rb
92
+ - lib/cnab_rb/return/cnab240/detail.rb
92
93
  - lib/cnab_rb/return/cnab240/generic_return.rb
93
94
  - lib/cnab_rb/return/return_factory.rb
94
95
  - lib/cnab_rb/version.rb
@@ -1,163 +0,0 @@
1
- module CnabRb::Layouts::Cnab240::Generic::Return
2
- class SegmentA < CnabRb::Layouts::Layout
3
- def init_fields
4
- field :bank_code,
5
- # codigo_banco
6
- pos: 1..3,
7
- picture: '9(3)'
8
-
9
- field :service_batch,
10
- # lote_servico
11
- pos: 4..7,
12
- picture: '9(4)'
13
-
14
- field :registry_type,
15
- # tipo_registro
16
- pos: 8..8,
17
- picture: '9(1)',
18
- default: '3'
19
-
20
- field :sequential_number_batch,
21
- # numero_sequencial_lote
22
- pos: 9..13,
23
- picture: '9(5)'
24
-
25
- field :segment_code,
26
- # codigo_segmento
27
- pos: 14..14,
28
- picture: 'X(1)',
29
- default: 'A'
30
-
31
- field :movement_type,
32
- # tipo_movimento
33
- pos: 15..15,
34
- picture: '9(1)',
35
- default: ''
36
-
37
- field :movement_instruction_code,
38
- # codigo_instrucao_movimento
39
- pos: 16..17,
40
- picture: '9(2)'
41
-
42
- field :centering_chamber,
43
- # camara_centralizadora
44
- pos: 18..20,
45
- picture: '9(3)'
46
-
47
- field :favored_bank,
48
- # banco_favorecido
49
- pos: 21..23,
50
- picture: '9(3)'
51
-
52
- field :favored_agency,
53
- # agencia_favorecido
54
- pos: 24..28,
55
- picture: '9(5)'
56
-
57
- field :favored_agency_cd,
58
- # agencia_dv_favorecido
59
- pos: 29..29,
60
- picture: 'X(1)'
61
-
62
- field :favored_account,
63
- # conta_favorecido
64
- pos: 30..41,
65
- picture: '9(12)'
66
-
67
- field :favored_account_cd,
68
- # conta_dv_favorecido
69
- pos: 42..42,
70
- picture: 'X(1)'
71
-
72
- field :favored_agency_account_cd,
73
- # agencia_conta_dv_favorecido
74
- pos: 43..43,
75
- picture: 'X(1)'
76
-
77
- field :favored_name,
78
- # nome_favorecido
79
- pos: 44..73,
80
- picture: 'X(30)'
81
-
82
- field :document_number,
83
- # numero_documento
84
- pos: 74..93,
85
- picture: 'X(20)'
86
-
87
- field :payment_date,
88
- # data_pagamento
89
- pos: 94..101,
90
- picture: '9(8)',
91
- date_format: '%d%m%Y'
92
-
93
- field :currency_code,
94
- # tipo_moeda
95
- pos: 102..104,
96
- picture: 'X(3)',
97
- default: 'BRL'
98
-
99
- field :coin_quantity,
100
- # quantidade_moeda
101
- pos: 105..119,
102
- picture: '9(10)V9(5)'
103
-
104
- field :payment_amount,
105
- # valor_pagamento
106
- pos: 120..134,
107
- picture: '9(13)V9(2)'
108
-
109
- field :our_number,
110
- # nosso_numero
111
- pos: 135..154,
112
- picture: 'X(20)'
113
-
114
- field :real_date,
115
- # data_real
116
- pos: 155..162,
117
- picture: '9(8)',
118
- date_format: '%d%m%Y'
119
-
120
- field :real_amount,
121
- # valor_real
122
- pos: 163..177,
123
- picture: '9(13)V9(2)'
124
-
125
- field :information_2,
126
- # informacao_2
127
- pos: 178..217,
128
- picture: 'X(40)'
129
-
130
- field :document_finality,
131
- # finalidade_doc
132
- pos: 218..219,
133
- picture: 'X(2)'
134
-
135
- field :ted_finality,
136
- # finalidade_ted
137
- pos: 220..224,
138
- picture: 'X(5)'
139
-
140
- field :complementary_finality,
141
- # finalidade_complementar
142
- pos: 225..226,
143
- picture: 'X(2)'
144
-
145
- field :exclusive_use_febraban_1,
146
- # uso_exclusivo_febraban
147
- pos: 227..229,
148
- picture: 'X(3)',
149
- default: ''
150
-
151
- field :notice,
152
- # aviso
153
- pos: 230..230,
154
- picture: '9(1)'
155
-
156
- field :ocurrences,
157
- # ocorencias
158
- pos: 231..240,
159
- picture: 'X(10)',
160
- default: ''
161
- end
162
- end
163
- end