From 06ebb3d553586c4f486fddd4b7aa51e17524a1d8 Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Fri, 25 Sep 2015 19:15:33 -0300 Subject: [PATCH 01/11] =?UTF-8?q?Corrigido=20informa=C3=A7oes=20que=20falt?= =?UTF-8?q?avam?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../febraban/cnab_240/cnab_240.py | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py index fe5de22..7afb638 100644 --- a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py +++ b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py @@ -66,17 +66,21 @@ def _prepare_header(self): :param: :return: """ + # 'arquivo_data_de_geracao': 27062012, + data_de_geracao = self.order.date_created[0:4] + self.order.date_created[5:7] + self.order.date_created[8:11] + hora_de_geracao = str(datetime.datetime.now().hour-3) + str(datetime.datetime.now().minute) + return { - 'arquivo_data_de_geracao': 27062012, - 'arquivo_hora_de_geracao': 112000, - 'arquivo_sequencia': 1, + 'arquivo_data_de_geracao': int(data_de_geracao), + 'arquivo_hora_de_geracao': int(hora_de_geracao), + 'arquivo_sequencia':self.order.id, 'cedente_inscricao_tipo': self.inscricao_tipo, 'cedente_inscricao_numero': int(punctuation_rm( self.order.company_id.cnpj_cpf)), 'cedente_agencia': int(self.order.mode.bank_id.bra_number), 'cedente_conta': int(self.order.mode.bank_id.acc_number), 'cedente_agencia_conta_dv': int( - self.order.mode.bank_id.bra_number_dig), + self.order.mode.bank_id.acc_number_dig), 'cedente_nome': self.order.company_id.legal_name, 'cedente_codigo_agencia_digito': int( self.order.mode.bank_id.bra_number_dig), @@ -118,20 +122,22 @@ def _prepare_segmento(self, line): :return: """ carteira, nosso_numero, digito = self.nosso_numero( - line.move_line_id.transaction_ref) # TODO: Improve! + str(line.move_line_id.transaction_ref)) # TODO: Improve! prefixo, sulfixo = self.cep(line.partner_id.zip) + v_t = "{0:.2f}".format(line.move_line_id.debit), # Decimal('100.00'), return { - 'cedente_agencia': 4459, # FIXME - 'cedente_conta': 17600, # FIXME - 'cedente_agencia_conta_dv': 6, + 'cedente_agencia': int(self.order.mode.bank_id.bra_number), # FIXME + 'cedente_conta': int(self.order.mode.bank_id.acc_number), # FIXME + 'cedente_agencia_conta_dv': int( + self.order.mode.bank_id.acc_number_dig), 'carteira_numero': int(carteira), 'nosso_numero': int(nosso_numero), 'nosso_numero_dv': int(digito), - 'identificacao_titulo': u'0000000', # TODO + 'identificacao_titulo': u'%s' % str(line.move_line_id.move_id.id), # u'0000000', TODO 'numero_documento': line.name, 'vencimento_titulo': self.format_date( line.ml_maturity_date), - 'valor_titulo': Decimal('100.00'), + 'valor_titulo': Decimal(v_t[0]), 'especie_titulo': 8, # TODO: 'aceite_titulo': u'A', # TODO: 'data_emissao_titulo': self.format_date( From 51c0d1fdb98fc9659a943efa3bb9a0fb86b87c56 Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Sat, 26 Sep 2015 09:17:59 -0300 Subject: [PATCH 02/11] arrumado campo valor --- .../febraban/cnab_240/cnab_240.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py index 7afb638..8ff1342 100644 --- a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py +++ b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py @@ -124,7 +124,6 @@ def _prepare_segmento(self, line): carteira, nosso_numero, digito = self.nosso_numero( str(line.move_line_id.transaction_ref)) # TODO: Improve! prefixo, sulfixo = self.cep(line.partner_id.zip) - v_t = "{0:.2f}".format(line.move_line_id.debit), # Decimal('100.00'), return { 'cedente_agencia': int(self.order.mode.bank_id.bra_number), # FIXME 'cedente_conta': int(self.order.mode.bank_id.acc_number), # FIXME @@ -137,7 +136,8 @@ def _prepare_segmento(self, line): 'numero_documento': line.name, 'vencimento_titulo': self.format_date( line.ml_maturity_date), - 'valor_titulo': Decimal(v_t[0]), + #'valor_titulo': Decimal(v_t), + 'valor_titulo': Decimal("{0:,.2f}".format(line.move_line_id.debit)), # Decimal('100.00'), 'especie_titulo': 8, # TODO: 'aceite_titulo': u'A', # TODO: 'data_emissao_titulo': self.format_date( From b470a8f2bb7fe52e132c4ebfa1c3546b6e0abc3a Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Mon, 28 Sep 2015 16:24:45 -0300 Subject: [PATCH 03/11] Incluido dependencia que faltava. --- l10n_br_account_banking_payment_cnab/__openerp__.py | 1 + 1 file changed, 1 insertion(+) mode change 100644 => 100755 l10n_br_account_banking_payment_cnab/__openerp__.py diff --git a/l10n_br_account_banking_payment_cnab/__openerp__.py b/l10n_br_account_banking_payment_cnab/__openerp__.py old mode 100644 new mode 100755 index d52f907..7ef1955 --- a/l10n_br_account_banking_payment_cnab/__openerp__.py +++ b/l10n_br_account_banking_payment_cnab/__openerp__.py @@ -35,6 +35,7 @@ 'depends': [ 'l10n_br_account_payment_boleto', 'l10n_br_account_payment_mode', + 'account_direct_debit', ], 'data': [ 'view/l10n_br_payment_cnab.xml', From 46fee19b24b23c0fde3c07ecfb68b29a6a091b24 Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Tue, 29 Sep 2015 09:33:15 -0300 Subject: [PATCH 04/11] adicionado novos campos para o Cnab --- l10n_br_account_payment_boleto/views/payment_mode.xml | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 l10n_br_account_payment_boleto/views/payment_mode.xml diff --git a/l10n_br_account_payment_boleto/views/payment_mode.xml b/l10n_br_account_payment_boleto/views/payment_mode.xml old mode 100644 new mode 100755 From 74432a77430cb4fac802cb399065ac2055638793 Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Tue, 29 Sep 2015 09:33:29 -0300 Subject: [PATCH 05/11] adicionado novos campos para o Cnab --- l10n_br_account_payment_boleto/models/payment_mode.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 l10n_br_account_payment_boleto/models/payment_mode.py diff --git a/l10n_br_account_payment_boleto/models/payment_mode.py b/l10n_br_account_payment_boleto/models/payment_mode.py old mode 100644 new mode 100755 From 0bfe2934851fde3eb98a2127bdf9e9f39b087839 Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Tue, 29 Sep 2015 09:38:50 -0300 Subject: [PATCH 06/11] Arrumado campo data, hora e buscando dados de protesto --- .../febraban/cnab_240/cnab_240.py | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) mode change 100644 => 100755 l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py diff --git a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py old mode 100644 new mode 100755 index 8ff1342..d505013 --- a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py +++ b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py @@ -66,9 +66,10 @@ def _prepare_header(self): :param: :return: """ - # 'arquivo_data_de_geracao': 27062012, - data_de_geracao = self.order.date_created[0:4] + self.order.date_created[5:7] + self.order.date_created[8:11] - hora_de_geracao = str(datetime.datetime.now().hour-3) + str(datetime.datetime.now().minute) + data_de_geracao = self.order.date_created[8:11] + self.order.date_created[5:7] + self.order.date_created[0:4] + #hora_de_geracao = str(datetime.datetime.now().hour-3) + str(datetime.datetime.now().minute) + t = datetime.datetime.now() - datetime.timedelta(hours=3) # FIXME + hora_de_geracao = t.strftime("%H%M%S") return { 'arquivo_data_de_geracao': int(data_de_geracao), @@ -124,6 +125,10 @@ def _prepare_segmento(self, line): carteira, nosso_numero, digito = self.nosso_numero( str(line.move_line_id.transaction_ref)) # TODO: Improve! prefixo, sulfixo = self.cep(line.partner_id.zip) + if self.order.mode.boleto_aceite == 'S': + aceite = 'A' + else: + aceite = 'N' return { 'cedente_agencia': int(self.order.mode.bank_id.bra_number), # FIXME 'cedente_conta': int(self.order.mode.bank_id.acc_number), # FIXME @@ -138,11 +143,12 @@ def _prepare_segmento(self, line): line.ml_maturity_date), #'valor_titulo': Decimal(v_t), 'valor_titulo': Decimal("{0:,.2f}".format(line.move_line_id.debit)), # Decimal('100.00'), - 'especie_titulo': 8, # TODO: - 'aceite_titulo': u'A', # TODO: + 'especie_titulo': int(self.order.mode.boleto_especie), + 'aceite_titulo': u'%s' %(aceite), # TODO: 'data_emissao_titulo': self.format_date( line.ml_date_created), - 'juros_mora_taxa_dia': Decimal('2.00'), + #'juros_mora_taxa_dia': Decimal('2.00'), + 'juros_mora_taxa_dia': Decimal("{0:,.2f}".format(line.move_line_id.debit * 0.00066666667)), # FIXME 'valor_abatimento': Decimal('0.00'), 'sacado_inscricao_tipo': int( self.sacado_inscricao_tipo(line.partner_id)), @@ -156,8 +162,8 @@ def _prepare_segmento(self, line): 'sacado_cep_sufixo': int(sulfixo), 'sacado_cidade': line.partner_id.l10n_br_city_id.name, 'sacado_uf': line.partner_id.state_id.code, - 'codigo_protesto': 3, - 'prazo_protesto': 0, + 'codigo_protesto': int(self.order.mode.boleto_protesto), + 'prazo_protesto': int(self.order.mode.boleto_protesto_prazo), 'codigo_baixa': 0, 'prazo_baixa': 0, } From ca099569a31fbd4d1aa6d64f3c2d018dc26ab20f Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Tue, 29 Sep 2015 09:57:21 -0300 Subject: [PATCH 07/11] adicionado novos campos para o Cnab --- .../models/payment_mode.py | 27 ++++++++++++++++++- .../views/payment_mode.xml | 3 +++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/l10n_br_account_payment_boleto/models/payment_mode.py b/l10n_br_account_payment_boleto/models/payment_mode.py index a33fc36..5ffe47a 100755 --- a/l10n_br_account_payment_boleto/models/payment_mode.py +++ b/l10n_br_account_payment_boleto/models/payment_mode.py @@ -39,7 +39,32 @@ class PaymentMode(models.Model): [('S', 'Sim'), ('N', 'Não')], string='Aceite', default='N') boleto_type = fields.Selection( selection, string="Boleto") - + boleto_especie = fields.Selection([ + ('01', u'DUPLICATA MERCANTIL'), + ('02', u'NOTA PROMISSÓRIA'), + ('03', u'NOTA DE SEGURO'), + ('04', u'MENSALIDADE ESCOLAR'), + ('05', u'RECIBO'), + ('06', u'CONTRATO'), + ('07', u'COSSEGUROS'), + ('08', u'DUPLICATA DE SERVIÇO'), + ('09', u'LETRA DE CÂMBIO'), + ('13', u'NOTA DE DÉBITOS'), + ('15', u'DOCUMENTO DE DÍVIDA'), + ('16', u'ENCARGOS CONDOMINIAIS'), + ('17', u'CONTA DE PRESTAÇÃO DE SERVIÇOS'), + ('99', u'DIVERSOS'), + ], string=u'Espécie do Título', default='01') + boleto_protesto = fields.Selection([ + ('0', u'Sem instrução'), + ('1', u'Protestar (Dias Corridos)'), + ('2', u'Protestar (Dias Úteis)'), + ('3', u'Não protestar'), + ('7', u'Negativar (Dias Corridos)'), + ('8', u'Não Negativar') + ], string=u'Códigos de Protesto', default='0') + boleto_protesto_prazo = fields.Char(u'Prazo protesto', size=2) + @api.constrains('boleto_type', 'boleto_carteira', 'boleto_modalidade', 'boleto_convenio', 'boleto_variacao', 'boleto_aceite') diff --git a/l10n_br_account_payment_boleto/views/payment_mode.xml b/l10n_br_account_payment_boleto/views/payment_mode.xml index b394dbd..e2798a0 100755 --- a/l10n_br_account_payment_boleto/views/payment_mode.xml +++ b/l10n_br_account_payment_boleto/views/payment_mode.xml @@ -17,6 +17,9 @@ + + + From 4f6219cd9a3c122ee32b063015f85d75f14e0ff3 Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Wed, 21 Oct 2015 14:30:33 -0200 Subject: [PATCH 08/11] Adicionado banco Sicredi --- l10n_br_account_payment_boleto/boleto/document.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/l10n_br_account_payment_boleto/boleto/document.py b/l10n_br_account_payment_boleto/boleto/document.py index 61d391f..1794968 100644 --- a/l10n_br_account_payment_boleto/boleto/document.py +++ b/l10n_br_account_payment_boleto/boleto/document.py @@ -102,6 +102,7 @@ def _cedente(self, company): :param company: :return: """ + self.boleto.logo_image = company.logo self.boleto.cedente = company.partner_id.legal_name.encode('utf-8') self.boleto.cedente_documento = company.cnpj_cpf.encode('utf-8') self.boleto.cedente_bairro = company.district @@ -271,6 +272,14 @@ def __init__(self, move_line, nosso_numero): Boleto.__init__(self, move_line, nosso_numero) self.boleto.nosso_numero = self.nosso_numero +class BoletoSicredi(Boleto): + + def __init__(self, move_line, nosso_numero): + self.boleto = Boleto.getBoletoClass(move_line)() + self.account_number = move_line.payment_mode_id.bank_id.acc_number + self.branch_number = move_line.payment_mode_id.bank_id.bra_number + Boleto.__init__(self, move_line, nosso_numero) + self.boleto.nosso_numero = self.nosso_numero dict_boleto = { '1' : (BoletoBB, 'Banco do Brasil 18'), @@ -284,6 +293,7 @@ def __init__(self, move_line, nosso_numero): '9' : (BoletoSantander101, 'Santander 102'), '10': (BoletoStatander101201, 'Santander 101, 201'), '11': (BoletoCaixaSigcb, 'Caixa Sigcb'), + '12': (BoletoSicredi, 'Sicredi'), } def getBoletoSelection(): From 95d6476f1507058b1d38b7f9af69726f409cbf20 Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Wed, 21 Oct 2015 14:38:35 -0200 Subject: [PATCH 09/11] =?UTF-8?q?Adicionado=20toda=20rotina=20incluir=5Fco?= =?UTF-8?q?branca=20dentro=20=20de=20remessa,=20pois,=20como=20estava=20da?= =?UTF-8?q?va=20erro=20na=20numera=C3=A7=C3=A3o=20dos=20registros.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../febraban/cnab_240/cnab_240.py | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py index d505013..bc4740b 100755 --- a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py +++ b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py @@ -23,6 +23,9 @@ from ..cnab import Cnab from cnab240.tipos import Arquivo +from cnab240.tipos import Evento +from cnab240.tipos import Lote +from cnab240.bancos import itau from decimal import Decimal from openerp.addons.l10n_br_base.tools.misc import punctuation_rm import datetime @@ -70,7 +73,6 @@ def _prepare_header(self): #hora_de_geracao = str(datetime.datetime.now().hour-3) + str(datetime.datetime.now().minute) t = datetime.datetime.now() - datetime.timedelta(hours=3) # FIXME hora_de_geracao = t.strftime("%H%M%S") - return { 'arquivo_data_de_geracao': int(data_de_geracao), 'arquivo_hora_de_geracao': int(hora_de_geracao), @@ -138,7 +140,7 @@ def _prepare_segmento(self, line): 'nosso_numero': int(nosso_numero), 'nosso_numero_dv': int(digito), 'identificacao_titulo': u'%s' % str(line.move_line_id.move_id.id), # u'0000000', TODO - 'numero_documento': line.name, + 'numero_documento': line.move_line_id.invoice.internal_number, 'vencimento_titulo': self.format_date( line.ml_maturity_date), #'valor_titulo': Decimal(v_t), @@ -176,8 +178,35 @@ def remessa(self, order): """ self.order = order self.arquivo = Arquivo(self.bank, **self._prepare_header()) + codigo_evento = 1 + evento = Evento(self.bank, codigo_evento) + for line in order.line_ids: - self.arquivo.incluir_cobranca(**self._prepare_segmento(line)) + seg = self._prepare_segmento(line) + seg_p = itau.registros.SegmentoP(**seg) + evento.adicionar_segmento(seg_p) + + seg_q = itau.registros.SegmentoQ(**seg) + evento.adicionar_segmento(seg_q) + + lote_cobranca = self.arquivo.encontrar_lote(codigo_evento) + + if lote_cobranca is None: + header = itau.registros.HeaderLoteCobranca(**self.arquivo.header.todict()) + trailer = itau.registros.TrailerLoteCobranca() + lote_cobranca = Lote(self.bank, header, trailer) + self.arquivo.adicionar_lote(lote_cobranca) + + if header.controlecob_numero is None: + header.controlecob_numero = int('{0}{1:02}'.format( + self.arquivo.header.arquivo_sequencia, + lote_cobranca.codigo)) + + if header.controlecob_data_gravacao is None: + header.controlecob_data_gravacao = self.arquivo.header.arquivo_data_de_geracao + + lote_cobranca.adicionar_evento(evento) + self.arquivo.trailer.totais_quantidade_registros += len(evento) remessa = unicode(self.arquivo) return unicodedata.normalize( 'NFKD', remessa).encode('ascii', 'ignore') From 1335ecc3a3856ee8852a5ecfc5caf3079e2c67bd Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Mon, 26 Oct 2015 12:39:28 -0200 Subject: [PATCH 10/11] arrumado nome da variavel. --- .../febraban/cnab_240/cnab_240.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py index bc4740b..8025a6d 100755 --- a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py +++ b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py @@ -25,7 +25,7 @@ from cnab240.tipos import Arquivo from cnab240.tipos import Evento from cnab240.tipos import Lote -from cnab240.bancos import itau +from cnab240.bancos import banco from decimal import Decimal from openerp.addons.l10n_br_base.tools.misc import punctuation_rm import datetime @@ -183,17 +183,17 @@ def remessa(self, order): for line in order.line_ids: seg = self._prepare_segmento(line) - seg_p = itau.registros.SegmentoP(**seg) + seg_p = banco.registros.SegmentoP(**seg) evento.adicionar_segmento(seg_p) - seg_q = itau.registros.SegmentoQ(**seg) + seg_q = banco.registros.SegmentoQ(**seg) evento.adicionar_segmento(seg_q) lote_cobranca = self.arquivo.encontrar_lote(codigo_evento) if lote_cobranca is None: - header = itau.registros.HeaderLoteCobranca(**self.arquivo.header.todict()) - trailer = itau.registros.TrailerLoteCobranca() + header = banco.registros.HeaderLoteCobranca(**self.arquivo.header.todict()) + trailer = banco.registros.TrailerLoteCobranca() lote_cobranca = Lote(self.bank, header, trailer) self.arquivo.adicionar_lote(lote_cobranca) From 16184b97d64e3714ae45222d944171d880b094b2 Mon Sep 17 00:00:00 2001 From: Luis Felipe Mileo Date: Mon, 16 Nov 2015 12:13:42 -0200 Subject: [PATCH 11/11] [REF] PEP8 --- .../__openerp__.py | 46 +-- .../parser/__init__.py | 1 + .../parser/cnab240_parser.py | 20 +- .../statement.py | 3 +- .../README.rst | 4 +- .../__init__.py | 2 +- .../febraban/cnab.py | 1 - .../febraban/cnab_240/bancos/bradesco.py | 1 - .../febraban/cnab_240/bancos/cef.py | 1 - .../febraban/cnab_240/cnab_240.py | 58 ++-- .../febraban/cnab_400/cnab_400.py | 1 - .../view/l10n_br_payment_cnab.xml | 23 +- .../wizard/payment_order_create.py | 1 - .../boleto/document.py | 83 +++--- .../data/boleto_data.xml | 3 +- .../demo/payment_demo.xml | 273 ++++++++++-------- .../models/account_invoice.py | 2 +- .../models/account_move_line.py | 7 +- .../models/payment_mode.py | 2 +- .../models/res_company.py | 2 +- .../reports/report.py | 4 +- .../views/account_move_line.xml | 22 +- .../views/payment_mode.xml | 9 +- .../views/res_company.xml | 22 +- l10n_br_account_payment_mode/__openerp__.py | 6 +- .../demo/payment_demo.xml | 180 ++++++------ .../models/payment_mode.py | 1 - .../views/payment_mode_view.xml | 27 +- .../views/payment_view.xml | 48 +-- 29 files changed, 455 insertions(+), 398 deletions(-) diff --git a/__unported__/account_statement_l10n_br_cnab240_import/__openerp__.py b/__unported__/account_statement_l10n_br_cnab240_import/__openerp__.py index 8a983dc..4b98065 100644 --- a/__unported__/account_statement_l10n_br_cnab240_import/__openerp__.py +++ b/__unported__/account_statement_l10n_br_cnab240_import/__openerp__.py @@ -20,30 +20,30 @@ ############################################################################## {'name': "Bank statement CNAB 240 import", - 'version': '1.0.0', - 'author': 'KMEE', - 'maintainer': 'Luis Felipe Mileo', - 'category': 'Finance', - 'complexity': 'normal', - 'depends': [ - 'account_statement_commission', - 'account_statement_transactionid_import' - ], - 'external_dependencies': { - 'python': ['cnab240'], - }, - 'description': """ - Allows to import CNAB 240 (Centro Nacional de Automação Bancária) statement files, using - *account_statement_base_import* generic inheritance mechanism to import - statements. + 'version': '1.0.0', + 'author': 'KMEE', + 'maintainer': 'Luis Felipe Mileo', + 'category': 'Finance', + 'complexity': 'normal', + 'depends': [ + 'account_statement_commission', + 'account_statement_transactionid_import' + ], + 'external_dependencies': { + 'python': ['cnab240'], + }, + 'description': """ + Allows to import CNAB 240 (Centro Nacional de Automação Bancária) statement + files, using *account_statement_base_import* generic inheritance + mechanism to import statements. It requires python cnab240 library to work. """, - 'website': 'http://www.kmee.com.br', - 'data': [], - 'test': [], - 'installable': True, - 'images': [], - 'auto_install': False, - 'license': 'AGPL-3', + 'website': 'http://www.kmee.com.br', + 'data': [], + 'test': [], + 'installable': True, + 'images': [], + 'auto_install': False, + 'license': 'AGPL-3', } diff --git a/__unported__/account_statement_l10n_br_cnab240_import/parser/__init__.py b/__unported__/account_statement_l10n_br_cnab240_import/parser/__init__.py index bf8f8cc..b8818f3 100644 --- a/__unported__/account_statement_l10n_br_cnab240_import/parser/__init__.py +++ b/__unported__/account_statement_l10n_br_cnab240_import/parser/__init__.py @@ -18,4 +18,5 @@ # along with this program. If not, see . # ############################################################################## + from . import cnab240_parser diff --git a/__unported__/account_statement_l10n_br_cnab240_import/parser/cnab240_parser.py b/__unported__/account_statement_l10n_br_cnab240_import/parser/cnab240_parser.py index 981dc87..43fb3bb 100644 --- a/__unported__/account_statement_l10n_br_cnab240_import/parser/cnab240_parser.py +++ b/__unported__/account_statement_l10n_br_cnab240_import/parser/cnab240_parser.py @@ -24,6 +24,7 @@ from openerp.tools.translate import _ from openerp.addons.account_statement_base_import.parser import \ BankStatementImportParser + try: import cnab240 from cnab240.bancos import cef @@ -57,26 +58,27 @@ def _parse(self, *args, **kwargs): cnab240_file.seek(0) cnab240_file.write(self.filebuffer) cnab240_file.flush() - + ret_file = codecs.open(cnab240_file.name, encoding='ascii') arquivo = Arquivo(cef, arquivo=ret_file) cnab240_file.close() - + res = [] for lote in arquivo.lotes: for evento in lote.eventos: - - res.append({ + res.append({ 'name': evento.sacado_nome, - 'date': datetime.datetime.strptime(str(evento.vencimento_titulo), '%d%m%Y'), + 'date': datetime.datetime.strptime( + str(evento.vencimento_titulo), '%d%m%Y'), 'amount': evento.valor_titulo, 'ref': evento.numero_documento, - 'label': evento.sacado_inscricao_numero, #cnpj - 'transaction_id': evento.nosso_numero_identificacao, #nosso numero - 'commission_amount':evento.valor_tarifas, + 'label': evento.sacado_inscricao_numero, # cnpj + 'transaction_id': evento.nosso_numero_identificacao, + # nosso numero + 'commission_amount': evento.valor_tarifas, }) - + self.result_row_list = res return True diff --git a/__unported__/account_statement_l10n_br_cnab240_import/statement.py b/__unported__/account_statement_l10n_br_cnab240_import/statement.py index e0357e4..ad9d5f7 100644 --- a/__unported__/account_statement_l10n_br_cnab240_import/statement.py +++ b/__unported__/account_statement_l10n_br_cnab240_import/statement.py @@ -30,5 +30,6 @@ def _get_import_type_selection(self, cr, uid, context=None): selection = super(AccountStatementProfil, self )._get_import_type_selection(cr, uid, context=context) - selection.append(('cnab240_so', _(u'CNAB 240 - Centro Nacional de Automação Bancária'))) + selection.append(('cnab240_so', _( + u'CNAB 240 - Centro Nacional de Automação Bancária'))) return selection diff --git a/l10n_br_account_banking_payment_cnab/README.rst b/l10n_br_account_banking_payment_cnab/README.rst index 4f21ec5..c867055 100644 --- a/l10n_br_account_banking_payment_cnab/README.rst +++ b/l10n_br_account_banking_payment_cnab/README.rst @@ -1,5 +1,5 @@ .. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :alt: License: AGPL-3 +:alt: License: AGPL-3 Account Banking Brazillian - Payments Export Infrastructure ============================================================= @@ -60,7 +60,7 @@ Maintainer ---------- .. image:: https://brasil.odoo.com/logo.png - :alt: Odoo Brazil +:alt: Odoo Brazil :target: http://brazil.odoo.com This module is maintained by the Odoo Brazil. diff --git a/l10n_br_account_banking_payment_cnab/__init__.py b/l10n_br_account_banking_payment_cnab/__init__.py index 2a266f1..a74946f 100644 --- a/l10n_br_account_banking_payment_cnab/__init__.py +++ b/l10n_br_account_banking_payment_cnab/__init__.py @@ -21,4 +21,4 @@ # ############################################################################## -import wizard \ No newline at end of file +import wizard diff --git a/l10n_br_account_banking_payment_cnab/febraban/cnab.py b/l10n_br_account_banking_payment_cnab/febraban/cnab.py index bd45468..3dd72cb 100644 --- a/l10n_br_account_banking_payment_cnab/febraban/cnab.py +++ b/l10n_br_account_banking_payment_cnab/febraban/cnab.py @@ -24,7 +24,6 @@ class Cnab(object): - def __init__(self): pass diff --git a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/bancos/bradesco.py b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/bancos/bradesco.py index 7117769..f86176e 100644 --- a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/bancos/bradesco.py +++ b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/bancos/bradesco.py @@ -26,6 +26,5 @@ class BradescoCnab240(Cnab240): - def __init__(self): super(Cnab240, self).__init__() diff --git a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/bancos/cef.py b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/bancos/cef.py index f786f24..a7fc7c9 100644 --- a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/bancos/cef.py +++ b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/bancos/cef.py @@ -25,6 +25,5 @@ class Cef240(Cnab240): - def __init__(self): super(Cnab240, self).__init__() diff --git a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py index 8025a6d..7d503c0 100755 --- a/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py +++ b/l10n_br_account_banking_payment_cnab/febraban/cnab_240/cnab_240.py @@ -38,6 +38,7 @@ class Cnab240(Cnab): """ """ + def __init__(self): super(Cnab, self).__init__() @@ -69,14 +70,17 @@ def _prepare_header(self): :param: :return: """ - data_de_geracao = self.order.date_created[8:11] + self.order.date_created[5:7] + self.order.date_created[0:4] - #hora_de_geracao = str(datetime.datetime.now().hour-3) + str(datetime.datetime.now().minute) - t = datetime.datetime.now() - datetime.timedelta(hours=3) # FIXME + data_de_geracao = (self.order.date_created[8:11] + + self.order.date_created[5:7] + + self.order.date_created[0:4]) + # hora_de_geracao = (str(datetime.datetime.now().hour-3) + + # str(datetime.datetime.now().minute)) + t = datetime.datetime.now() - datetime.timedelta(hours=3) # FIXME hora_de_geracao = t.strftime("%H%M%S") return { 'arquivo_data_de_geracao': int(data_de_geracao), 'arquivo_hora_de_geracao': int(hora_de_geracao), - 'arquivo_sequencia':self.order.id, + 'arquivo_sequencia': self.order.id, 'cedente_inscricao_tipo': self.inscricao_tipo, 'cedente_inscricao_numero': int(punctuation_rm( self.order.company_id.cnpj_cpf)), @@ -129,28 +133,34 @@ def _prepare_segmento(self, line): prefixo, sulfixo = self.cep(line.partner_id.zip) if self.order.mode.boleto_aceite == 'S': aceite = 'A' - else: + else: aceite = 'N' return { - 'cedente_agencia': int(self.order.mode.bank_id.bra_number), # FIXME - 'cedente_conta': int(self.order.mode.bank_id.acc_number), # FIXME + 'cedente_agencia': int( + self.order.mode.bank_id.bra_number), # FIXME + 'cedente_conta': int(self.order.mode.bank_id.acc_number), # FIXME 'cedente_agencia_conta_dv': int( self.order.mode.bank_id.acc_number_dig), 'carteira_numero': int(carteira), 'nosso_numero': int(nosso_numero), 'nosso_numero_dv': int(digito), - 'identificacao_titulo': u'%s' % str(line.move_line_id.move_id.id), # u'0000000', TODO + 'identificacao_titulo': u'%s' % str(line.move_line_id.move_id.id), + # u'0000000', TODO 'numero_documento': line.move_line_id.invoice.internal_number, 'vencimento_titulo': self.format_date( line.ml_maturity_date), - #'valor_titulo': Decimal(v_t), - 'valor_titulo': Decimal("{0:,.2f}".format(line.move_line_id.debit)), # Decimal('100.00'), - 'especie_titulo': int(self.order.mode.boleto_especie), - 'aceite_titulo': u'%s' %(aceite), # TODO: + # 'valor_titulo': Decimal(v_t), + 'valor_titulo': Decimal("{0:,.2f}".format( + line.move_line_id.debit)), + # Decimal('100.00'), + 'especie_titulo': int(self.order.mode.boleto_especie), + 'aceite_titulo': u'%s' % (aceite), # TODO: 'data_emissao_titulo': self.format_date( line.ml_date_created), - #'juros_mora_taxa_dia': Decimal('2.00'), - 'juros_mora_taxa_dia': Decimal("{0:,.2f}".format(line.move_line_id.debit * 0.00066666667)), # FIXME + # 'juros_mora_taxa_dia': Decimal('2.00'), + 'juros_mora_taxa_dia': Decimal( + "{0:,.2f}".format(line.move_line_id.debit * 0.00066666667)), + # FIXME 'valor_abatimento': Decimal('0.00'), 'sacado_inscricao_tipo': int( self.sacado_inscricao_tipo(line.partner_id)), @@ -179,22 +189,23 @@ def remessa(self, order): self.order = order self.arquivo = Arquivo(self.bank, **self._prepare_header()) codigo_evento = 1 - evento = Evento(self.bank, codigo_evento) - + evento = Evento(self.bank, codigo_evento) + for line in order.line_ids: seg = self._prepare_segmento(line) seg_p = banco.registros.SegmentoP(**seg) evento.adicionar_segmento(seg_p) - + seg_q = banco.registros.SegmentoQ(**seg) evento.adicionar_segmento(seg_q) - + lote_cobranca = self.arquivo.encontrar_lote(codigo_evento) - + if lote_cobranca is None: - header = banco.registros.HeaderLoteCobranca(**self.arquivo.header.todict()) + header = banco.registros.HeaderLoteCobranca( + **self.arquivo.header.todict()) trailer = banco.registros.TrailerLoteCobranca() - lote_cobranca = Lote(self.bank, header, trailer) + lote_cobranca = Lote(self.bank, header, trailer) self.arquivo.adicionar_lote(lote_cobranca) if header.controlecob_numero is None: @@ -203,8 +214,9 @@ def remessa(self, order): lote_cobranca.codigo)) if header.controlecob_data_gravacao is None: - header.controlecob_data_gravacao = self.arquivo.header.arquivo_data_de_geracao - + header.controlecob_data_gravacao = \ + self.arquivo.header.arquivo_data_de_geracao + lote_cobranca.adicionar_evento(evento) self.arquivo.trailer.totais_quantidade_registros += len(evento) remessa = unicode(self.arquivo) diff --git a/l10n_br_account_banking_payment_cnab/febraban/cnab_400/cnab_400.py b/l10n_br_account_banking_payment_cnab/febraban/cnab_400/cnab_400.py index 42b4a19..16e2694 100644 --- a/l10n_br_account_banking_payment_cnab/febraban/cnab_400/cnab_400.py +++ b/l10n_br_account_banking_payment_cnab/febraban/cnab_400/cnab_400.py @@ -22,7 +22,6 @@ class Cnab400(Cnab): - def __init__(self): super(Cnab, self).__init__() diff --git a/l10n_br_account_banking_payment_cnab/view/l10n_br_payment_cnab.xml b/l10n_br_account_banking_payment_cnab/view/l10n_br_payment_cnab.xml index eadaaa2..eec1388 100644 --- a/l10n_br_account_banking_payment_cnab/view/l10n_br_payment_cnab.xml +++ b/l10n_br_account_banking_payment_cnab/view/l10n_br_payment_cnab.xml @@ -1,23 +1,26 @@ - + - payment.cnab.form - payment.cnab - -
+ payment.cnab.form + payment.cnab + + - + - +
-