brcobranca 6.1.12 → 6.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a8357d98813233926aeafbfad7fccb85167df58
4
- data.tar.gz: a904ec2dd6dafd35f253b627dc970ebae79582fa
3
+ metadata.gz: 6b06f755fa56ec27a52b74780c9470deacbe804d
4
+ data.tar.gz: 2ce84cf00772023ba39dd87bb45a42e025ce655e
5
5
  SHA512:
6
- metadata.gz: 4ab57e16e0f813cb5e06a1a83f8bcc1f8679ee73aed806f7084c1e7a98bee288446c755ad23506aeb997e8f9e2473f9880677195c97930e13a7634c8eeba560b
7
- data.tar.gz: 722cfd5ddd5298ab75772552116a85f55c72af9e1b306d03144a32feefe3fae26a986e002f6c36a5d1621f132ab3617c8e766681c4b0496860f7113520139959
6
+ metadata.gz: cfba8123e3794caaba45f98559b9e958b14cb8031691b7a85285b2aba6ce416a1ce0d1795fc736d72ddc3d06b06d216f006320370870cef95fd106b9f4b27400
7
+ data.tar.gz: a428a6bd1979c68b0fb5d0be4e2d17df9c8bd880b9003c5a2670c91d569d7dcec21f2dda55ec94d3fb38d08926d9e99ba00d48249d99549e797254561e853666
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- brcobranca (6.1.12)
4
+ brcobranca (6.2.0)
5
5
  activemodel (>= 3)
6
6
  parseline (~> 1.0.3)
7
7
  rghost (~> 0.9)
@@ -116,4 +116,4 @@ DEPENDENCIES
116
116
  timecop
117
117
 
118
118
  BUNDLED WITH
119
- 1.10.6
119
+ 1.11.2
@@ -22,10 +22,7 @@ module Brcobranca
22
22
  # "4" -A4 sem envelopamento
23
23
  # "6" -A4 sem envelopamento 3 vias
24
24
 
25
- attr_accessor :parcela
26
- # Parcela - 02 posições (11 a 12) - "01" se parcela única
27
-
28
- validates_presence_of :modalidade_carteira, :tipo_formulario, :parcela, message: 'não pode estar em branco.'
25
+ validates_presence_of :modalidade_carteira, :tipo_formulario, message: 'não pode estar em branco.'
29
26
  # Remessa 400 - 8 digitos
30
27
  # Remessa 240 - 12 digitos
31
28
  validates_length_of :conta_corrente, maximum: 8, message: 'deve ter 8 dígitos.'
@@ -35,9 +32,7 @@ module Brcobranca
35
32
  def initialize(campos = {})
36
33
  campos = { emissao_boleto: '2',
37
34
  distribuicao_boleto: '2',
38
- especie_titulo: '02',
39
35
  tipo_formulario: '4',
40
- parcela: '01',
41
36
  modalidade_carteira: '01',
42
37
  forma_cadastramento: '0' }.merge!(campos)
43
38
  super(campos)
@@ -120,7 +115,7 @@ module Brcobranca
120
115
  segmento_p << pagamento.formata_valor(15) # valor documento 15
121
116
  segmento_p << ''.rjust(5, '0') # agencia cobradora 5
122
117
  segmento_p << '0' # dv agencia cobradora 1
123
- segmento_p << especie_titulo # especie do titulo 2
118
+ segmento_p << pagamento.especie_titulo # especie do titulo 2
124
119
  segmento_p << aceite # aceite 1
125
120
  segmento_p << pagamento.data_emissao.strftime('%d%m%Y') # data de emissao titulo 8
126
121
  segmento_p << '0' # cod. do juros 1 *
@@ -148,7 +143,7 @@ module Brcobranca
148
143
  # digito conta 1
149
144
  # digito agencia/conta 1
150
145
  # ident. titulo no banco 20
151
- "#{conta_corrente.rjust(12, '0')}#{digito_conta} #{formata_nosso_numero(pagamento.nosso_numero)}"
146
+ "#{conta_corrente.rjust(12, '0')}#{digito_conta} #{formata_nosso_numero(pagamento)}"
152
147
  end
153
148
 
154
149
  # Retorna o nosso numero
@@ -166,8 +161,8 @@ module Brcobranca
166
161
  # "4" -A4 sem envelopamento
167
162
  # "6" -A4 sem envelopamento 3 vias
168
163
  # Em branco - 05 posições (16 a 20)
169
- def formata_nosso_numero(nosso_numero)
170
- "#{nosso_numero.to_s.rjust(10, '0')}#{parcela}#{modalidade_carteira}#{tipo_formulario}#{''.to_s.rjust(5, ' ')}"
164
+ def formata_nosso_numero(pagamento)
165
+ "#{pagamento.nosso_numero.to_s.rjust(10, '0')}#{pagamento.parcela.to_s.rjust(2, '0')}#{modalidade_carteira}#{tipo_formulario}#{''.to_s.rjust(5, ' ')}"
171
166
  end
172
167
  end
173
168
  end
@@ -3,6 +3,9 @@ module Brcobranca
3
3
  module Remessa
4
4
  module Cnab400
5
5
  class Base < Brcobranca::Remessa::Base
6
+ # documento do cedente
7
+ attr_accessor :documento_cedente
8
+
6
9
  validates_presence_of :carteira, message: 'não pode estar em branco.'
7
10
 
8
11
  # Data da geracao do arquivo seguindo o padrao DDMMAA
@@ -3,8 +3,6 @@ module Brcobranca
3
3
  module Remessa
4
4
  module Cnab400
5
5
  class Citibank < Brcobranca::Remessa::Cnab400::Base
6
- # documento do cedente
7
- attr_accessor :documento_cedente
8
6
  # Identificação do portfolio.
9
7
  # Necessário consultar o Citibank para informações referentes à conta cobrança e carteira do cliente.
10
8
  attr_accessor :portfolio
@@ -3,9 +3,6 @@ module Brcobranca
3
3
  module Remessa
4
4
  module Cnab400
5
5
  class Itau < Brcobranca::Remessa::Cnab400::Base
6
- # documento do cedente
7
- attr_accessor :documento_cedente
8
-
9
6
  validates_presence_of :agencia, :conta_corrente, message: 'não pode estar em branco.'
10
7
  validates_presence_of :documento_cedente, :digito_conta, message: 'não pode estar em branco.'
11
8
  validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
@@ -3,9 +3,6 @@ module Brcobranca
3
3
  module Remessa
4
4
  module Cnab400
5
5
  class Santander < Brcobranca::Remessa::Cnab400::Base
6
- # documento do cedente
7
- attr_accessor :documento_cedente
8
-
9
6
  # Código de Transmissão
10
7
  # Consultar seu gerente para pegar esse código. Geralmente está no e-mail enviado pelo banco.
11
8
  attr_accessor :codigo_transmissao
@@ -100,7 +97,7 @@ module Brcobranca
100
97
  detalhe << ''.rjust(6, '0') # data limite para o segundo desconto 9[06]
101
98
  detalhe << ' ' # brancos X[01]
102
99
  detalhe << pagamento.codigo_multa # Com multa = 4, Sem multa = 0 9[01]
103
- detalhe << pagamento.percentual_multa.rjust(4, '0') # Percentual multa por atraso % 9[04]
100
+ detalhe << pagamento.formata_valor_multa(4) # Percentual multa por atraso % 9[04]
104
101
  detalhe << '00' # Unidade de valor moeda corrente = 00 9[02]
105
102
  detalhe << '0'.rjust(13, '0') # Valor do título em outra unidade 9[13]
106
103
  detalhe << ''.rjust(4, ' ') # brancos X[04]
@@ -0,0 +1,307 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Brcobranca
3
+ module Remessa
4
+ module Cnab400
5
+ class Sicoob < Brcobranca::Remessa::Cnab400::Base
6
+ # convenio do cedente
7
+ attr_accessor :convenio
8
+
9
+ attr_accessor :modalidade_carteira
10
+ # identificacao da emissao do boleto (attr na classe base)
11
+ # opcoes:
12
+ # ‘1’ = Banco Emite
13
+ # ‘2’ = Cliente Emite
14
+
15
+ attr_accessor :distribuicao_boleto
16
+ #
17
+ # identificacao da distribuicao do boleto (attr na classe base)
18
+ # opcoes:
19
+ # ‘1’ = Banco distribui
20
+ # ‘2’ = Cliente distribui
21
+
22
+ attr_accessor :tipo_formulario
23
+ # Tipo Formulário - 01 posição (15 a 15):
24
+ # "1" -auto-copiativo
25
+ # "3" -auto-envelopável
26
+ # "4" -A4 sem envelopamento
27
+ # "6" -A4 sem envelopamento 3 vias
28
+
29
+ # convenio do cedente
30
+ attr_accessor :convenio
31
+
32
+ validates_presence_of :agencia, :conta_corrente, :carteira, :convenio, :modalidade_carteira, :tipo_formulario, :digito_conta, :sequencial_remessa, :documento_cedente, message: 'não pode estar em branco.'
33
+ # Remessa 400 - 8 digitos
34
+ # Remessa 240 - 12 digitos
35
+ validates_length_of :conta_corrente, is: 8, message: 'deve ter 8 dígitos.'
36
+ validates_length_of :agencia, is: 4, message: 'deve ter 4 dígitos.'
37
+ validates_length_of :modalidade_carteira, is: 1, message: 'deve ter 1 dígitos.'
38
+ validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
39
+ validates_length_of :sequencial_remessa, maximum: 7, message: 'deve ter 7 dígitos.'
40
+ validates_length_of :carteira, is: 2, message: 'deve ter 2 dígitos.'
41
+ validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
42
+
43
+ # Com DV
44
+ validates_length_of :convenio, is: 9, message: 'deve ter 9 dígitos.'
45
+
46
+ def initialize(campos = {})
47
+ campos = {
48
+ distribuicao_boleto: '2',
49
+ tipo_formulario: '4',
50
+ modalidade_carteira: '2',
51
+ sequencial_remessa: '0000001',
52
+ carteira: '01'
53
+ }.merge!(campos)
54
+ super(campos)
55
+ end
56
+
57
+ def cod_banco
58
+ '756'
59
+ end
60
+
61
+ def nome_banco
62
+ 'BANCOOBCED'.format_size(15)
63
+ end
64
+
65
+ # Informacoes do Código de Transmissão
66
+ #
67
+ # @return [String]
68
+ #
69
+ def info_conta
70
+ # CAMPO TAMANHO
71
+ # 030 004 9(004) Prefixo da Cooperativa: vide planilha "Capa" deste arquivo
72
+ # 031 001 A(001) Dígito Verificador do Prefixo: vide planilha "Capa" deste arquivo
73
+ # 039 008 9(008) Código do Cliente/Beneficiário: vide planilha "Capa" deste arquivo
74
+ # 040 001 A(001) Dígito Verificador do Código: vide planilha "Capa" deste arquivo
75
+ # 046 006 9(006) Número do convênio líder: Brancos
76
+ "#{agencia}#{digito_agencia}#{convenio} "
77
+ end
78
+
79
+ def digito_agencia
80
+ # utilizando a agencia com 4 digitos
81
+ # para calcular o digito
82
+ agencia.modulo11(mapeamento: { 10 => 'X' }).to_s
83
+ end
84
+
85
+ # Complemento do header
86
+ #
87
+ # @return [String]
88
+ #
89
+ def complemento
90
+ ''.rjust(287, ' ')
91
+ end
92
+
93
+ # Header do arquivo remessa
94
+ #
95
+ # @return [String]
96
+ #
97
+ def monta_header
98
+ # CAMPO TAMANHO VALOR
99
+ # 001 001 9(001) Identificação do Registro Header: “0” (zero)
100
+ # 002 001 9(001) Tipo de Operação: “1” (um)
101
+ # 009 007 A(007) Identificação por Extenso do Tipo de Operação: "REMESSA"
102
+ # 011 002 9(002) Identificação do Tipo de Serviço: “01” (um)
103
+ # 019 008 A(008) Identificação por Extenso do Tipo de Serviço: “COBRANÇA”
104
+ # 026 007 A(007) Complemento do Registro: Brancos
105
+ # 030 004 9(004) Prefixo da Cooperativa: vide planilha "Capa" deste arquivo
106
+ # 031 001 A(001) Dígito Verificador do Prefixo: vide planilha "Capa" deste arquivo
107
+ # 039 008 9(008) Código do Cliente/Beneficiário: vide planilha "Capa" deste arquivo
108
+ # 040 001 A(001) Dígito Verificador do Código: vide planilha "Capa" deste arquivo
109
+ # 046 006 9(006) Número do convênio líder: Brancos
110
+ # 076 030 A(030) Nome do Beneficiário: vide planilha "Capa" deste arquivo
111
+ # 094 018 A(018) Identificação do Banco: "756BANCOOBCED"
112
+ # 100 006 9(006) Data da Gravação da Remessa: formato ddmmaa
113
+ # 107 007 9(007) Seqüencial da Remessa: número seqüencial acrescido de 1 a cada remessa. Inicia com "0000001"
114
+ # 394 287 A(287) Complemento do Registro: Brancos
115
+ # 400 006 9(006) Seqüencial do Registro:”000001”
116
+
117
+ "01REMESSA01COBRANCA #{info_conta}#{empresa_mae.format_size(30)}#{cod_banco}#{nome_banco}#{data_geracao}#{sequencial_remessa}#{complemento}000001"
118
+ end
119
+
120
+ # Detalhe do arquivo
121
+ #
122
+ # @param pagamento [PagamentoCnab400]
123
+ # objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
124
+ # @param sequencial
125
+ # num. sequencial do registro no arquivo
126
+ #
127
+ # @return [String]
128
+ #
129
+ def monta_detalhe(pagamento, sequencial)
130
+ fail Brcobranca::RemessaInvalida.new(pagamento) if pagamento.invalid?
131
+
132
+ detalhe = '1' # identificacao transacao 9[01]
133
+ detalhe << Brcobranca::Util::Empresa.new(documento_cedente).tipo # tipo de identificacao da empresa 9[02]
134
+ detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
135
+ detalhe << agencia # Prefixo da Cooperativa 9[4]
136
+ detalhe << digito_agencia # Digito da Cooperativa 9[1]
137
+ detalhe << conta_corrente # Conta corrente 9[8]
138
+ detalhe << digito_conta # Digito da conta corrente 9[1]
139
+ detalhe << '000000' # Convênio de Cobrança do Beneficiário: "000000" 9[6]
140
+ detalhe << ''.rjust(25, ' ') # Número de Controle do Participante: Brancos X[25]
141
+ detalhe << pagamento.nosso_numero.to_s.rjust(12, '0') # nosso numero com DV 9[12]
142
+ detalhe << pagamento.parcela.to_s.rjust(2, '0') # Número da Parcela: "01" se parcela única 9[02]
143
+ detalhe << '00' # Grupo de Valor: "00" 9[02]
144
+ detalhe << ' ' # Complemento do Registro: Brancos X[03]
145
+
146
+ # "Indicativo de Mensagem ou Sacador/Avalista:
147
+ # Brancos: Poderá ser informada nas posições 352 a 391 (SEQ 50) qualquer mensagem para ser impressa no boleto;
148
+ # “A”: Deverá ser informado nas posições 352 a 391 (SEQ 50) o nome e CPF/CNPJ do sacador"
149
+ detalhe << ' ' # X[01]
150
+ detalhe << ' ' # Prefixo do Título: Brancos X[03]
151
+ detalhe << '000' # Variação da Carteira: "000" 9[03]
152
+ detalhe << '0' # Conta Caução: "0" 9[01]
153
+
154
+ # "Número do Contrato Garantia:
155
+ # Para Carteira 1 preencher ""00000"";
156
+ # Para Carteira 3 preencher com o número do contrato sem DV."
157
+ detalhe << '00000' # Número do Contrato Garantia 9[05]
158
+ detalhe << '0' # DV do contrato 9[01]
159
+ detalhe << '000000' # Numero do borderô: preencher em caso de carteira 3 9[06]
160
+ detalhe << ' ' # Complemento do Registro: Brancos X[04]
161
+
162
+ # "Tipo de Emissão:
163
+ # 1 - Cooperativa
164
+ # 2 - Cliente"
165
+ detalhe << modalidade_carteira # Tipo de Emissão 9[01]
166
+
167
+ # "Carteira/Modalidade:
168
+ # 01 = Simples Com Registro
169
+ # 02 = Simples Sem Registro
170
+ # 03 = Garantida Caucionada "
171
+ detalhe << carteira # codigo da carteira 9[02]
172
+
173
+ # "Comando/Movimento:
174
+ # 01 = Registro de Títulos
175
+ # 02 = Solicitação de Baixa
176
+ # 04 = Concessão de Abatimento
177
+ # 05 = Cancelamento de Abatimento
178
+ # 06 = Alteração de Vencimento
179
+ # 08 = Alteração de Seu Número
180
+ # 09 = Instrução para Protestar
181
+ # 10 = Instrução para Sustar Protesto
182
+ # 11 = Instrução para Dispensar Juros
183
+ # 12 = Alteração de Pagador
184
+ # 31 = Alteração de Outros Dados
185
+ # 34 = Baixa - Pagamento Direto ao Beneficiário
186
+
187
+ detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
188
+ detalhe << pagamento.numero_documento.to_s.rjust(10, '0') # numero do documento X[10]
189
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
190
+ detalhe << pagamento.formata_valor # valor do documento 9[13]
191
+ detalhe << cod_banco # codigo banco 9[03]
192
+ detalhe << agencia # Prefixo da Cooperativa 9[4]
193
+ detalhe << digito_agencia # Digito da Cooperativa 9[1]
194
+
195
+ # "Espécie do Título :
196
+ # 01 = Duplicata Mercantil
197
+ # 02 = Nota Promissória
198
+ # 03 = Nota de Seguro
199
+ # 05 = Recibo
200
+ # 06 = Duplicata Rural
201
+ # 08 = Letra de Câmbio
202
+ # 09 = Warrant
203
+ # 10 = Cheque
204
+ # 12 = Duplicata de Serviço
205
+ # 13 = Nota de Débito
206
+ # 14 = Triplicata Mercantil
207
+ # 15 = Triplicata de Serviço
208
+ # 18 = Fatura
209
+ # 20 = Apólice de Seguro
210
+ # 21 = Mensalidade Escolar
211
+ # 22 = Parcela de Consórcio
212
+ # 99 = Outros"
213
+ detalhe << pagamento.especie_titulo # Espécie de documento 9[02]
214
+ detalhe << '0' # aceite (A=1/N=0) X[01]
215
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
216
+
217
+ # "Primeira instrução codificada:
218
+ # Regras de impressão de mensagens nos boletos:
219
+ # * Primeira instrução (SEQ 34) = 00 e segunda (SEQ 35) = 00, não imprime nada.
220
+ # * Primeira instrução (SEQ 34) = 01 e segunda (SEQ 35) = 01, desconsidera-se as instruções CNAB e imprime as mensagens relatadas no trailler do arquivo.
221
+ # * Primeira e segunda instrução diferente das situações acima, imprimimos o conteúdo CNAB:
222
+ # 00 = AUSENCIA DE INSTRUCOES
223
+ # 01 = COBRAR JUROS
224
+ # 03 = PROTESTAR 3 DIAS UTEIS APOS VENCIMENTO
225
+ # 04 = PROTESTAR 4 DIAS UTEIS APOS VENCIMENTO
226
+ # 05 = PROTESTAR 5 DIAS UTEIS APOS VENCIMENTO
227
+ # 07 = NAO PROTESTAR
228
+ # 10 = PROTESTAR 10 DIAS UTEIS APOS VENCIMENTO
229
+ # 15 = PROTESTAR 15 DIAS UTEIS APOS VENCIMENTO
230
+ # 20 = PROTESTAR 20 DIAS UTEIS APOS VENCIMENTO
231
+ # 22 = CONCEDER DESCONTO SO ATE DATA ESTIPULADA
232
+ # 42 = DEVOLVER APOS 15 DIAS VENCIDO
233
+ # 43 = DEVOLVER APOS 30 DIAS VENCIDO"
234
+ detalhe << '00' # Instrução para o título 9[02]
235
+ detalhe << '00' # Número de dias válidos para instrução 9[02]
236
+ detalhe << pagamento.formata_valor_mora(6) # valor mora ao dia 9[06]
237
+ detalhe << pagamento.formata_valor_multa(6) # taxa de multa 9[06]
238
+ detalhe << distribuicao_boleto # indentificacao entrega 9[01]
239
+ detalhe << pagamento.formata_data_desconto # data limite para desconto 9[06]
240
+ detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
241
+
242
+ # "193-193 – Código da moeda
243
+ # 194-205 – Valor IOF / Quantidade Monetária: ""000000000000""
244
+ # Se o código da moeda for REAL, o valor restante representa o IOF.
245
+ # Se o código da moeda for diferente de REAL, o valor restante será a quantidade monetária.
246
+ detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
247
+ detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
248
+ detalhe << pagamento.identificacao_sacado.rjust(2, '0') # identificacao do pagador 9[02]
249
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
250
+ detalhe << pagamento.nome_sacado.format_size(40).ljust(40, ' ') # nome do pagador X[40]
251
+ detalhe << pagamento.endereco_sacado.format_size(37).ljust(37, ' ')# endereco do pagador X[37]
252
+ detalhe << pagamento.bairro_sacado.format_size(15).ljust(15, ' ') # bairro do pagador X[15]
253
+ detalhe << pagamento.cep_sacado # cep do pagador 9[08]
254
+ detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
255
+ detalhe << pagamento.uf_sacado # uf do pagador X[02]
256
+
257
+ # "Observações/Mensagem ou Sacador/Avalista:
258
+ # Quando o SEQ 14 – Indicativo de Mensagem ou Sacador/Avalista - for preenchido com Brancos,
259
+ # as informações constantes desse campo serão impressas no campo “texto de responsabilidade da Empresa”,
260
+ # no Recibo do Sacado e na Ficha de Compensação do boleto de cobrança.
261
+ # Quando o SEQ 14 – Indicativo de Mensagem ou Sacador/Avalista - for preenchido com “A” ,
262
+ # este campo deverá ser preenchido com o nome/razão social do Sacador/Avalista"
263
+ detalhe << ''.rjust(40, ' ') # X[40]
264
+
265
+ # "Número de Dias Para Protesto:
266
+ # Quantidade dias para envio protesto. Se = ""0"",
267
+ # utilizar dias protesto padrão do cliente cadastrado na cooperativa. "
268
+ detalhe << '00' # Número de Dias Para Protesto x[02]
269
+ detalhe << ' ' # Brancos X[1]
270
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
271
+ detalhe
272
+ end
273
+
274
+ # Trailer do arquivo remessa
275
+ #
276
+ # @param sequencial
277
+ # num. sequencial do registro no arquivo
278
+ #
279
+ # @return [String]
280
+ #
281
+ def monta_trailer(sequencial)
282
+ # CAMPO TAMANHO VALOR
283
+ # 1 001 001 001 9(01) Identificação Registro Trailler: "9"
284
+ # 2 002 194 193 X(193) Complemento do Registro: Brancos
285
+ # 3 195 234 040 X(40) "Mensagem responsabilidade Beneficiário:
286
+ # Quando o SEQ 34 = ""01"" e o SEQ 35 = ""01"", preencher com mensagens/intruções de responsabilidade do Beneficiário
287
+ # Quando o SEQ 34 e SEQ 35 forem preenchidos com valores diferentes destes, preencher com Brancos"
288
+ # 4 235 274 040 X(40) "Mensagem responsabilidade Beneficiário:
289
+ # Quando o SEQ 34 = ""01"" e o SEQ 35 = ""01"", preencher com mensagens/intruções de responsabilidade do Beneficiário
290
+ # Quando o SEQ 34 e SEQ 35 forem preenchidos com valores diferentes destes, preencher com Brancos"
291
+ # 5 275 314 040 X(40) "Mensagem responsabilidade Beneficiário:
292
+ # Quando o SEQ 34 = ""01"" e o SEQ 35 = ""01"", preencher com mensagens/intruções de responsabilidade do Beneficiário
293
+ # Quando o SEQ 34 e SEQ 35 forem preenchidos com valores diferentes destes, preencher com Brancos"
294
+ # 6 315 354 040 X(40) "Mensagem responsabilidade Beneficiário:
295
+ # Quando o SEQ 34 = ""01"" e o SEQ 35 = ""01"", preencher com mensagens/intruções de responsabilidade do Beneficiário
296
+ # Quando o SEQ 34 e SEQ 35 forem preenchidos com valores diferentes destes, preencher com Brancos"
297
+ # 7 355 394 040 X(40) "Mensagem responsabilidade Beneficiário:
298
+ # Quando o SEQ 34 = ""01"" e o SEQ 35 = ""01"", preencher com mensagens/intruções de responsabilidade do Beneficiário
299
+ # Quando o SEQ 34 e SEQ 35 forem preenchidos com valores diferentes destes, preencher com Brancos"
300
+ # 8 395 400 006 9(06) Seqüencial do Registro: Incrementado em 1 a cada registro
301
+
302
+ "9#{''.rjust(393, '0')}#{sequencial.to_s.rjust(6, '0')}"
303
+ end
304
+ end
305
+ end
306
+ end
307
+ end
@@ -67,6 +67,8 @@ module Brcobranca
67
67
  attr_accessor :percentual_multa
68
68
  # <b>OPCIONAL</b>: Data para cobrança de multa
69
69
  attr_accessor :data_multa
70
+ # <b>OPCIONAL</b>: Número da Parcela
71
+ attr_accessor :parcela
70
72
 
71
73
  validates_presence_of :nosso_numero, :data_vencimento, :valor,
72
74
  :documento_sacado, :nome_sacado, :endereco_sacado,
@@ -93,7 +95,8 @@ module Brcobranca
93
95
  especie_titulo: '01',
94
96
  identificacao_ocorrencia: '01',
95
97
  codigo_multa: '0',
96
- percentual_multa: '0'
98
+ percentual_multa: 0.0,
99
+ parcela: '01'
97
100
  }
98
101
 
99
102
  campos = padrao.merge!(campos)
@@ -166,6 +169,16 @@ module Brcobranca
166
169
  format_value(valor_mora, tamanho)
167
170
  end
168
171
 
172
+ # Formata o campo valor da multa
173
+ #
174
+ # @param tamanho [Integer]
175
+ # quantidade de caracteres a ser retornado
176
+ #
177
+ def formata_valor_multa(tamanho = 6)
178
+ format_value(percentual_multa, tamanho)
179
+ end
180
+
181
+
169
182
  # Formata o campo valor do desconto
170
183
  #
171
184
  # @param tamanho [Integer]
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  module Brcobranca
4
- VERSION = '6.1.12'
4
+ VERSION = '6.2.0'
5
5
  end
data/lib/brcobranca.rb CHANGED
@@ -147,7 +147,8 @@ module Brcobranca
147
147
  autoload :Bradesco, 'brcobranca/remessa/cnab400/bradesco'
148
148
  autoload :Itau, 'brcobranca/remessa/cnab400/itau'
149
149
  autoload :Citibank, 'brcobranca/remessa/cnab400/citibank'
150
- autoload :Santander, 'brcobranca/remessa/cnab400/santander'
150
+ autoload :Santander, 'brcobranca/remessa/cnab400/santander'
151
+ autoload :Sicoob, 'brcobranca/remessa/cnab400/sicoob'
151
152
  end
152
153
 
153
154
  module Cnab240
@@ -47,14 +47,6 @@ RSpec.describe Brcobranca::Remessa::Cnab240::Sicoob do
47
47
  end
48
48
  end
49
49
 
50
- context '@parcela' do
51
- it 'deve ser invalido se nao possuir a parcela' do
52
- objeto = subject.class.new(params.merge(parcela: nil))
53
- expect(objeto.invalid?).to be true
54
- expect(objeto.errors.full_messages).to include('Parcela não pode estar em branco.')
55
- end
56
- end
57
-
58
50
  context '@agencia' do
59
51
  it 'deve ser invalido se a agencia tiver mais de 4 digitos' do
60
52
  sicoob.agencia = '12345'
@@ -137,8 +129,8 @@ RSpec.describe Brcobranca::Remessa::Cnab240::Sicoob do
137
129
  end
138
130
 
139
131
  it 'formata o nosso numero' do
140
- nosso_numero = sicoob.formata_nosso_numero 1
141
- expect(nosso_numero).to eq "000000000101014 "
132
+ nosso_numero = sicoob.formata_nosso_numero pagamento
133
+ expect(nosso_numero).to eq "000000001201014 "
142
134
  end
143
135
  end
144
136
 
@@ -0,0 +1,178 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Brcobranca::Remessa::Cnab400::Sicoob do
5
+ let(:pagamento) do
6
+ Brcobranca::Remessa::Pagamento.new(valor: 199.9,
7
+ data_vencimento: Date.today,
8
+ nosso_numero: 123,
9
+ documento_sacado: '12345678901',
10
+ nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
11
+ endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
12
+ bairro_sacado: 'São josé dos quatro apostolos magros',
13
+ cep_sacado: '12345678',
14
+ cidade_sacado: 'Santa rita de cássia maria da silva',
15
+ uf_sacado: 'SP')
16
+ end
17
+ let(:params) do
18
+ { carteira: '01',
19
+ agencia: '4327',
20
+ conta_corrente: '12345678',
21
+ digito_conta: '1',
22
+ convenio: '123456789',
23
+ empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
24
+ documento_cedente: '12345678910',
25
+ pagamentos: [pagamento] }
26
+ end
27
+ let(:sicoob) { subject.class.new(params) }
28
+
29
+ context 'validacoes dos campos' do
30
+ context '@agencia' do
31
+ it 'deve ser invalido se nao possuir uma agencia' do
32
+ objeto = subject.class.new(params.merge!(agencia: nil))
33
+ expect(objeto.invalid?).to be true
34
+ expect(objeto.errors.full_messages).to include('Agencia não pode estar em branco.')
35
+ end
36
+
37
+ it 'deve ser invalido se a agencia tiver mais de 4 digitos' do
38
+ sicoob.agencia = '12345'
39
+ expect(sicoob.invalid?).to be true
40
+ expect(sicoob.errors.full_messages).to include('Agencia deve ter 4 dígitos.')
41
+ end
42
+ end
43
+
44
+ context '@digito_conta' do
45
+ it 'deve ser invalido se nao possuir um digito da conta corrente' do
46
+ objeto = subject.class.new(params.merge!(digito_conta: nil))
47
+ expect(objeto.invalid?).to be true
48
+ expect(objeto.errors.full_messages).to include('Digito conta não pode estar em branco.')
49
+ end
50
+
51
+ it 'deve ser invalido se a carteira tiver mais de 1 digito' do
52
+ sicoob.digito_conta = '12'
53
+ expect(sicoob.invalid?).to be true
54
+ expect(sicoob.errors.full_messages).to include('Digito conta deve ter 1 dígito.')
55
+ end
56
+ end
57
+
58
+ context '@conta_corrente' do
59
+ it 'deve ser invalido se nao possuir uma conta corrente' do
60
+ objeto = subject.class.new(params.merge!(conta_corrente: nil))
61
+ expect(objeto.invalid?).to be true
62
+ expect(objeto.errors.full_messages).to include('Conta corrente não pode estar em branco.')
63
+ end
64
+
65
+ it 'deve ser invalido se a conta corrente tiver mais de 8 digitos' do
66
+ sicoob.conta_corrente = '123456789'
67
+ expect(sicoob.invalid?).to be true
68
+ expect(sicoob.errors.full_messages).to include('Conta corrente deve ter 8 dígitos.')
69
+ end
70
+ end
71
+
72
+ context '@carteira' do
73
+ it 'deve ser invalido se nao possuir uma carteira' do
74
+ objeto = subject.class.new(params.merge!(carteira: nil))
75
+ expect(objeto.invalid?).to be true
76
+ expect(objeto.errors.full_messages).to include('Carteira não pode estar em branco.')
77
+ end
78
+
79
+ it 'deve ser invalido se a carteira tiver mais de 2 digitos' do
80
+ sicoob.carteira = '123'
81
+ expect(sicoob.invalid?).to be true
82
+ expect(sicoob.errors.full_messages).to include('Carteira deve ter 2 dígitos.')
83
+ end
84
+ end
85
+
86
+ context '@sequencial_remessa' do
87
+ it 'deve ser invalido se nao possuir um num. sequencial de remessa' do
88
+ objeto = subject.class.new(params.merge!(sequencial_remessa: nil))
89
+ expect(objeto.invalid?).to be true
90
+ expect(objeto.errors.full_messages).to include('Sequencial remessa não pode estar em branco.')
91
+ end
92
+
93
+ it 'deve ser invalido se sequencial de remessa tiver mais de 8 digitos' do
94
+ sicoob.sequencial_remessa = '12345678'
95
+ expect(sicoob.invalid?).to be true
96
+ expect(sicoob.errors.full_messages).to include('Sequencial remessa deve ter 7 dígitos.')
97
+ end
98
+ end
99
+
100
+ context '@convenio' do
101
+ it 'deve ser invalido se nao possuir um convenio' do
102
+ objeto = subject.class.new(params.merge!(convenio: nil))
103
+ expect(objeto.invalid?).to be true
104
+ expect(objeto.errors.full_messages).to include('Convenio não pode estar em branco.')
105
+ end
106
+
107
+ it 'deve ser invalido se convenio tiver mais de 9 digitos' do
108
+ sicoob.convenio = '1234567890'
109
+ expect(sicoob.invalid?).to be true
110
+ expect(sicoob.errors.full_messages).to include('Convenio deve ter 9 dígitos.')
111
+ end
112
+ end
113
+ end
114
+
115
+ context 'formatacoes dos valores' do
116
+ it 'cod_banco deve ser 756' do
117
+ expect(sicoob.cod_banco).to eq '756'
118
+ end
119
+
120
+ it 'nome_banco deve ser SICOOB com 15 posicoes' do
121
+ nome_banco = sicoob.nome_banco
122
+ expect(nome_banco.size).to eq 15
123
+ expect(nome_banco.strip).to eq 'BANCOOBCED'
124
+ end
125
+
126
+ it 'complemento deve ter 287 brancos' do
127
+ complemento = sicoob.complemento
128
+ expect(complemento.size).to eq 287
129
+ end
130
+
131
+ it 'info_conta deve ter 20 posicoes' do
132
+ expect(sicoob.info_conta.size).to eq 20
133
+ end
134
+
135
+ it 'identificacao da empresa deve ter as informacoes nas posicoes corretas' do
136
+ id_empresa = sicoob.info_conta
137
+ expect(id_empresa[0..3]).to eq '4327' # agencia
138
+ expect(id_empresa[4]).to eq '3' # digito_agencia
139
+ expect(id_empresa[5..13]).to eq '123456789' # convenio
140
+ expect(id_empresa[14..19]).to eq ' ' # brancos
141
+ end
142
+ end
143
+
144
+ context 'monta remessa' do
145
+ it_behaves_like 'cnab400'
146
+
147
+ context 'header' do
148
+ it 'informacoes devem estar posicionadas corretamente no header' do
149
+ header = sicoob.monta_header
150
+ expect(header[1]).to eq '1' # tipo operacao (1 = remessa)
151
+ expect(header[2..8]).to eq 'REMESSA' # literal da operacao
152
+ expect(header[26..45]).to eq sicoob.info_conta # informacoes da conta
153
+ expect(header[76..78]).to eq '756' # codigo do banco
154
+ end
155
+ end
156
+
157
+ context 'detalhe' do
158
+ it 'informacoes devem estar posicionadas corretamente no detalhe' do
159
+ detalhe = sicoob.monta_detalhe pagamento, 1
160
+ expect(detalhe[62..72]).to eq '00000000012' # nosso numero
161
+ expect(detalhe[73]).to eq '3' # digito nosso numero
162
+ expect(detalhe[74..75]).to eq '01' # parcela
163
+ expect(detalhe[120..125]).to eq Date.today.strftime('%d%m%y') # data de vencimento
164
+ expect(detalhe[126..138]).to eq '0000000019990' # valor do documento
165
+ expect(detalhe[220..233]).to eq '00012345678901' # documento do pagador
166
+ expect(detalhe[234..273]).to eq 'PABLO DIEGO JOSE FRANCISCO DE PAULA JUAN' # nome do pagador
167
+ expect(detalhe[274..310]).to eq 'RUA RIO GRANDE DO SUL Sao paulo Minas' # endereco do pagador
168
+ end
169
+ end
170
+
171
+ context 'arquivo' do
172
+ before { Timecop.freeze(Time.local(2015, 7, 14, 16, 15, 15)) }
173
+ after { Timecop.return }
174
+
175
+ it { expect(sicoob.gera_arquivo).to eq(read_remessa('remessa-sicoob-cnab400.rem', sicoob.gera_arquivo)) }
176
+ end
177
+ end
178
+ end
@@ -1,6 +1,6 @@
1
1
  75600000 274576177000177 0432730000000036668 SOCIEDADE BRASILEIRA DE ZOOLOGSICOOB 114072015161515000000081000000000000000000000000000000000000000000000
2
2
  75600011R01 040 2074576177000177 0432730000000036668 SOCIEDADE BRASILEIRA DE ZOOLOG 000000001407201500000000
3
- 7560001300001P 010432730000000036668 000000001201014 10 220000000000000001407201500000000000500000000002N14072015000000000000000000000000000000000000000000000000000000000000000000000000000000 1000000090000000000
3
+ 7560001300001P 010432730000000036668 000000001201014 10 220000000000000001407201500000000000500000000001N14072015000000000000000000000000000000000000000000000000000000000000000000000000000000 1000000090000000000
4
4
  7560001300002Q 011000082136760505PABLO DIEGO JOSE FRANCISCO DE PAULA JUANRUA RIO GRANDE DO SUL SAO PAULO MINAS CASAO JOSE DOS QU12345678SANTA RITA DE CRJ0000000000000000 000
5
5
  75600015 000004
6
6
  75699999 000001000006
@@ -0,0 +1,3 @@
1
+ 01REMESSA01COBRANCA 43273123456789 SOCIEDADE BRASILEIRA DE ZOOLOG756BANCOOBCED 1407150000001 000001
2
+ 1010001234567891043273123456781000000 0000000001230100 0000000000000000 201010000000000140715000000001999075643273010140715000000000000000020000000000000000000000000000000000000000000000100012345678901PABLO DIEGO JOSE FRANCISCO DE PAULA JUANRUA RIO GRANDE DO SUL SAO PAULO MINASSAO JOSE DOS QU12345678SANTA RITA DE CSP 00 000002
3
+ 9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003
@@ -41,9 +41,18 @@ shared_examples_for 'cnab400' do
41
41
  digito_conta: '8',
42
42
  pagamentos: [pagamento]
43
43
  }
44
+ elsif subject.class == Brcobranca::Remessa::Cnab400::Sicoob
45
+ { carteira: '01',
46
+ agencia: '1234',
47
+ conta_corrente: '12345678',
48
+ digito_conta: '1',
49
+ empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
50
+ documento_cedente: '12345678910',
51
+ convenio: '123456789',
52
+ pagamentos: [pagamento] }
44
53
  else
45
54
  { carteira: '123',
46
- agencia: '1234',
55
+ agencia: '4327',
47
56
  conta_corrente: '12345',
48
57
  digito_conta: '1',
49
58
  empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brcobranca
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.12
4
+ version: 6.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kivanio Barbosa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-16 00:00:00.000000000 Z
11
+ date: 2016-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rghost
@@ -152,6 +152,7 @@ files:
152
152
  - lib/brcobranca/remessa/cnab400/citibank.rb
153
153
  - lib/brcobranca/remessa/cnab400/itau.rb
154
154
  - lib/brcobranca/remessa/cnab400/santander.rb
155
+ - lib/brcobranca/remessa/cnab400/sicoob.rb
155
156
  - lib/brcobranca/remessa/pagamento.rb
156
157
  - lib/brcobranca/retorno/base.rb
157
158
  - lib/brcobranca/retorno/cnab240/base.rb
@@ -198,6 +199,7 @@ files:
198
199
  - spec/brcobranca/remessa/cnab400/citibank_spec.rb
199
200
  - spec/brcobranca/remessa/cnab400/itau_spec.rb
200
201
  - spec/brcobranca/remessa/cnab400/santander_spec.rb
202
+ - spec/brcobranca/remessa/cnab400/sicoob_spec.rb
201
203
  - spec/brcobranca/remessa/pagamento_spec.rb
202
204
  - spec/brcobranca/retorno/cnab240/base_spec.rb
203
205
  - spec/brcobranca/retorno/cnab240/sicoob_spec.rb
@@ -218,6 +220,7 @@ files:
218
220
  - spec/fixtures/remessa/remessa-citibank-cnab400.rem
219
221
  - spec/fixtures/remessa/remessa-itau-cnab400.rem
220
222
  - spec/fixtures/remessa/remessa-santander-cnab400.rem
223
+ - spec/fixtures/remessa/remessa-sicoob-cnab400.rem
221
224
  - spec/spec.opts
222
225
  - spec/spec_helper.rb
223
226
  - spec/support/remessa_helpers.rb
@@ -282,6 +285,7 @@ test_files:
282
285
  - spec/brcobranca/remessa/cnab400/citibank_spec.rb
283
286
  - spec/brcobranca/remessa/cnab400/itau_spec.rb
284
287
  - spec/brcobranca/remessa/cnab400/santander_spec.rb
288
+ - spec/brcobranca/remessa/cnab400/sicoob_spec.rb
285
289
  - spec/brcobranca/remessa/pagamento_spec.rb
286
290
  - spec/brcobranca/retorno/cnab240/base_spec.rb
287
291
  - spec/brcobranca/retorno/cnab240/sicoob_spec.rb
@@ -302,6 +306,7 @@ test_files:
302
306
  - spec/fixtures/remessa/remessa-citibank-cnab400.rem
303
307
  - spec/fixtures/remessa/remessa-itau-cnab400.rem
304
308
  - spec/fixtures/remessa/remessa-santander-cnab400.rem
309
+ - spec/fixtures/remessa/remessa-sicoob-cnab400.rem
305
310
  - spec/spec.opts
306
311
  - spec/spec_helper.rb
307
312
  - spec/support/remessa_helpers.rb