def montarArquivoNC_IDS(self, cr, uid, ids, context=None): # str = unicode(arquivo) # f = open('/tmp/arquivo_remessa.rem','w') # f.write(str) # python will convert \n to os.linesep # f.close() res = {} cnab_data = dict() # Header values dict_arquivo = self.get_header_data(cr, uid, ids, context) dict_salvar = dict_arquivo cnab_data['arquivo'] = dict_arquivo arquivo = Arquivo(cef, **cnab_data['arquivo']) # Segmentos nossa_classe_pool = self.pool.get('l10n_br_account.payment_receivable') segmento_pool = self.pool.get('cnab240export.segmentos') nossa_classe_ids = [] arquivo.lotes[0].header.servico_servico = 1 for nc_ids in nossa_classe_ids: # Para os dados de cada "nossa_classe_line" e correspondente # "move_line", inclua os segmentos P e Q. id_segmento = segmento_pool.create(cr, uid, context=None) segmento_cobranca = segmento_pool.write_segmentos( cr, uid, id_segmento, nc_ids, context) cnab_data['cobranca'] = segmento_cobranca arquivo.incluir_cobranca(**cnab_data['cobranca']) self.salva_dados(cr, uid, ids, dict_salvar, context) return res
class TestCnab240(unittest.TestCase): def __init__(self, *args, **kwargs): super(TestCnab240, self).__init__(*args, **kwargs) self.maxDiff = None def setUp(self): self.itau_data = get_itau_data_from_dict() self.arquivo = Arquivo(itau, **self.itau_data['arquivo']) def test_unicode(self): self.arquivo.incluir_cobranca(**self.itau_data['cobranca']) self.assertEqual(str(self.arquivo), get_itau_file_remessa()) def test_empty_data(self): arquivo = Arquivo(itau) self.assertRaises(errors.ArquivoVazioError, str, arquivo) def test_leitura_itau(self): return_file_path = os.path.join(ARQS_DIRPATH, 'cobranca.itau.ret') ret_file = codecs.open(return_file_path, encoding='ascii') arquivo = Arquivo(itau, arquivo=ret_file) ret_file.seek(0) self.assertEqual(ret_file.read(), str(arquivo)) ret_file.close()
class TestCnab240(unittest.TestCase): def __init__(self, *args, **kwargs): super(TestCnab240, self).__init__(*args, **kwargs) self.maxDiff = None def setUp(self): self.itau_data = get_itau_data_from_dict() self.arquivo = Arquivo(itau, **self.itau_data['arquivo']) def test_unicode(self): self.arquivo.incluir_cobranca(**self.itau_data['cobranca']) self.assertEqual(str(self.arquivo), get_itau_file_remessa()) def test_empty_data(self): arquivo = Arquivo(itau) self.assertRaises(errors.ArquivoVazioError, str, arquivo) def test_leitura(self): return_file_path = os.path.join(ARQS_DIRPATH, 'cobranca.itau.ret') ret_file = codecs.open(return_file_path, encoding='ascii') arquivo = Arquivo(itau, arquivo=ret_file) ret_file.seek(0) self.assertEqual(ret_file.read(), str(arquivo)) ret_file.close()
def montarArquivoNC_IDS(self, cr, uid, ids, context=None): # str = unicode(arquivo) # f = open('/tmp/arquivo_remessa.rem','w') # f.write(str) # python will convert \n to os.linesep # f.close() res = {} cnab_data = dict() # Header values dict_arquivo = self.get_header_data(cr, uid, ids, context) dict_salvar = dict_arquivo cnab_data['arquivo'] = dict_arquivo arquivo = Arquivo(cef, **cnab_data['arquivo']) # Segmentos nossa_classe_pool = self.pool.get('l10n_br_account.payment_receivable') segmento_pool = self.pool.get('cnab240export.segmentos') nossa_classe_ids = [] arquivo.lotes[0].header.servico_servico = 1 for nc_ids in nossa_classe_ids: # Para os dados de cada "nossa_classe_line" e correspondente # "move_line", inclua os segmentos P e Q. id_segmento = segmento_pool.create(cr, uid, context=None) segmento_cobranca = segmento_pool.write_segmentos(cr, uid, id_segmento, nc_ids, context) cnab_data['cobranca'] = segmento_cobranca arquivo.incluir_cobranca(**cnab_data['cobranca']) self.salva_dados(cr, uid, ids, dict_salvar, context) return res
class TestCnab240(unittest.TestCase): """ All tests related to file handling. """ def setUp(self): self.itau_data = get_itau_data_from_dict() self.arquivo = Arquivo(itau, **self.itau_data['arquivo']) def test_unicode(self): self.arquivo.incluir_cobranca(**self.itau_data['cobranca']) self.arquivo.incluir_cobranca(**self.itau_data['cobranca2']) _file = unicode(self.arquivo).splitlines() _itau = get_itau_file_remessa().splitlines() for ix, l in enumerate(_file): assert l == _itau[ix], "Error on line {}\n{}\n{}".format( ix, l, _itau[ix] ) def test_to_file_is_unicode(self): """ We check that what we write is what we are testing. Just to avoid regressions or being blind with bugs. Also, UTF-8 sanitization happens on dumping to file, so we have a special test below """ self.arquivo.incluir_cobranca(**self.itau_data['cobranca']) self.arquivo.incluir_cobranca(**self.itau_data['cobranca2']) strio = StringIO() self.arquivo.escrever(strio) _file = strio.getvalue().splitlines() _unicode = unicode(self.arquivo).splitlines() strio.close() for ix, l in enumerate(_file): assert l == _unicode[ix], u"Error on line {}\n{}\n{}".format( ix, l, _unicode[ix] ) def test_nonascii(self): """ Test if we can handle nonascii chars. """ nonascii = get_nonascii_data() self.arquivo.incluir_cobranca(**nonascii['cobranca']) self.arquivo.incluir_cobranca(**nonascii['cobranca2']) strio = StringIO() self.arquivo.escrever(strio) _file = strio.getvalue().splitlines() _itau = get_itau_file_remessa().splitlines() strio.close() for ix, l in enumerate(_file): assert l == _itau[ix], u"Error on line {}\n{}\n{}".format( ix, l, _itau[ix] ) # def test_record_limit(self): # """ Check that we limit the file to 178 records.""" # #self.assertEqual(len(self.arquivo), 0) # # import ipdb; ipdb.set_trace() # _add = self.arquivo.incluir_cobranca # data = self.itau_data['cobranca'] # # try: # i = 0 # for _ in xrange(88): # _add(**data) # i += 1 # except errors.ArquivoCheioError: # #assert False, 'Should fit, at {}'.format(i) # pass # else: # self.assertRaises(errors.ArquivoCheioError, _add, **data) # def test_assure_len(self): # """ Len of a record should be 2 and growth should be 2. """ # self.arquivo.c # self.assertEqual(len(self.arquivo), 0) # self.arquivo.incluir_cobranca(**self.itau_data['cobranca']) # # header + seg_p + seg_q # self.assertEqual(len(self.arquivo), 3) # self.arquivo.incluir_cobranca(**self.itau_data['cobranca']) # self.assertEqual(len(self.arquivo), 5) def test_empty_data(self): arquivo = Arquivo(itau) self.assertRaises(errors.ArquivoVazioError, unicode, arquivo) def test_leitura(self): return_file_path = os.path.join(ARQS_DIRPATH, 'cobranca.itau.ret') with codecs.open(return_file_path, encoding='ascii') as ret_file: arquivo = Arquivo(itau, arquivo=ret_file) ret_file.seek(0) self.assertEqual(ret_file.read(), unicode(arquivo))
class Cnab240(Cnab): def __init__(self): super(Cnab, self).__init__() @staticmethod def get_bank(bank): if bank == '237': from .bancos.bradesco import Bradesco240 return Bradesco240 elif bank == '756': from .bancos.sicoob import Sicoob240 return Sicoob240 elif bank == '001': from .bancos.banco_brasil import BancoBrasil240 return BancoBrasil240 elif bank == '0851': from .bancos.cecred import Cecred240 return Cecred240 elif bank == '341': from .bancos.itau import Itau240 return Itau240 elif bank == '033': from .bancos.santander import Santander240 return Santander240 elif bank == '104': from .bancos.cef import Cef240 return Cef240 elif bank == '748': from .bancos.sicredi import Sicredi240 return Sicredi240 else: return Cnab240 @property def inscricao_tipo(self): if self.order.company_id.partner_id.is_company: return 2 else: return 1 def _prepare_header(self): cnpj_cpf = re.sub('[^0-9]', '', self.order.company_id.cnpj_cpf) cedente_conta_dv = self.order.src_bank_account_id.acc_number_dig cedente_conta_dv = str(cedente_conta_dv) return { 'controle_banco': int(self.order.src_bank_account_id.bank_bic), 'arquivo_data_de_geracao': self.data_hoje(), 'arquivo_hora_de_geracao': self.hora_agora(), 'arquivo_sequencia': self.order.file_number, 'cedente_inscricao_tipo': self.inscricao_tipo, 'cedente_inscricao_numero': int(cnpj_cpf), 'cedente_agencia': int(self.order.src_bank_account_id.bra_number), 'cedente_conta': int(self.order.src_bank_account_id.acc_number), 'cedente_conta_dv': cedente_conta_dv, 'cedente_convenio': self.order.src_bank_account_id.codigo_convenio, 'cedente_agencia_dv': self.order.src_bank_account_id.bra_number_dig, 'cedente_nome': self.order.company_id.legal_name, # DV ag e conta 'cedente_dv_ag_cc': self.order.src_bank_account_id.bra_number_dig, 'arquivo_codigo': 1, # Remessa/Retorno 'servico_operacao': u'R', 'nome_banco': self.order.src_bank_account_id.bank_name } def get_file_numeration(self): numero = False # self.order.get_next_number() if not numero: numero = 1 return numero def format_date(self, srt_date): return int( datetime.datetime.strptime(srt_date, '%Y-%m-%d').strftime('%d%m%Y')) def nosso_numero(self, format): pass def cep(self, format): sulfixo = format[-3:] prefixo = format[:5] return prefixo, sulfixo def sacado_inscricao_tipo(self, partner_id): # TODO: Implementar codigo para PIS/PASEP if partner_id.is_company: return 2 else: return 1 def rmchar(self, format): return re.sub('[%s]' % re.escape(string.punctuation), '', format or '') def _prepare_segmento(self, line): prefixo, sulfixo = self.cep(line.partner_id.zip) # if not self.order.payment_mode_id.boleto_aceite == 'S': # aceite = u'A' # Código agencia do cedente # cedente_agencia = cedente_agencia # Dígito verificador da agência do cedente # cedente_agencia_conta_dv = cedente_agencia_dv # Código da conta corrente do cedente # cedente_conta = cedente_conta # Dígito verificador da conta corrente do cedente # cedente_conta_dv = cedente_conta_dv # Dígito verificador de agencia e conta # Era cedente_agencia_conta_dv agora é cedente_dv_ag_cc return { 'controle_banco': int(self.order.src_bank_account_id.bank_bic), 'cedente_agencia': int(self.order.src_bank_account_id.bra_number), 'cedente_conta': int(self.order.src_bank_account_id.acc_number), 'cedente_conta_dv': self.order.src_bank_account_id.acc_number_dig, 'cedente_convenio': self.order.src_bank_account_id.codigo_convenio, 'cedente_agencia_dv': self.order.src_bank_account_id.bra_number_dig, 'cedente_nome': self.order.company_id.legal_name, # DV ag e cc 'cedente_dv_ag_cc': self.order.src_bank_account_id.bra_number_dig, 'identificacao_titulo': u'0000000', # TODO 'identificacao_titulo_banco': u'0000000', # TODO 'identificacao_titulo_empresa': (' ' * 25), 'numero_documento': line.identifier, 'vencimento_titulo': self.format_date(line.date_maturity), 'valor_titulo': Decimal(str(line.amount_total)).quantize(Decimal('1.00')), # TODO: Código adotado para identificar o título de cobrança. # 8 é Nota de cŕedito comercial 'especie_titulo': int(self.order.payment_mode_id.boleto_especie), 'aceite_titulo': self.order.payment_mode_id.boleto_aceite, 'data_emissao_titulo': self.format_date(line.emission_date), # Taxa de juros do Odoo padrão mensal: 2. Campo 27.3P # CEF/FEBRABAN e Itaú não tem. 'codigo_juros': 2, 'juros_mora_data': self.format_date(line.date_maturity), 'juros_mora_taxa': Decimal(str( self.order.payment_mode_id.late_payment_interest)).quantize( Decimal('1.00')), # Multa padrão em percentual no Odoo, valor '2' 'codigo_multa': '2', 'data_multa': self.format_date(line.date_maturity), 'juros_multa': Decimal(str(self.order.payment_mode_id.late_payment_fee)).quantize( Decimal('1.00')), 'valor_abatimento': Decimal('0.00'), 'sacado_inscricao_tipo': int(self.sacado_inscricao_tipo(line.partner_id)), 'sacado_inscricao_numero': int(self.rmchar(line.partner_id.cnpj_cpf)), 'sacado_nome': line.partner_id.legal_name or line.partner_id.name, 'sacado_endereco': (line.partner_id.street + ' ' + line.partner_id.number), 'sacado_bairro': line.partner_id.district, 'sacado_cep': int(prefixo), 'sacado_cep_sufixo': int(sulfixo), 'sacado_cidade': line.partner_id.city_id.name, 'sacado_uf': line.partner_id.state_id.code, 'codigo_protesto': int(self.order.payment_mode_id.boleto_protesto), 'prazo_protesto': int(self.order.payment_mode_id.boleto_protesto_prazo), 'codigo_baixa': 2, 'prazo_baixa': 0, # De 5 a 120 dias. 'controlecob_data_gravacao': self.data_hoje(), 'cobranca_carteira': int(self.order.payment_mode_id.boleto_carteira[:2]), } def remessa(self, order): cobrancasimples_valor_titulos = 0 self.order = order self._hook_validation() header = self._prepare_header() self.arquivo = Arquivo(self.bank, **header) for line in order.line_ids: seg = self._prepare_segmento(line) self.arquivo.incluir_cobranca(header, **seg) self.arquivo.lotes[0].header.servico_servico = 1 # TODO: tratar soma de tipos de cobranca cobrancasimples_valor_titulos += line.amount_total self.arquivo.lotes[0].trailer.cobrancasimples_valor_titulos = \ Decimal(cobrancasimples_valor_titulos).quantize( Decimal('1.00')) return str(self.arquivo) def data_hoje(self): return (int(time.strftime("%d%m%Y"))) def hora_agora(self): return (int(time.strftime("%H%M%S"))) def _hook_validation(self): pass
class Cnab240(Cnab): """ """ def __init__(self): super(Cnab, self).__init__() @staticmethod def get_bank(bank): if bank == '341': from .bancos.itau import Itau240 return Itau240 elif bank == '237': from .bancos.bradesco import Bradesco240 return Bradesco240 elif bank == '104': from .bancos.cef import Cef240 return Cef240 elif bank == '033': from .bancos.santander import Santander240 return Santander240 elif bank == '756': from .bancos.sicoob import Sicoob240 return Sicoob240 else: return Cnab240 @property def inscricao_tipo(self): # TODO: Implementar codigo para PIS/PASEP if self.order.company_id.partner_id.is_company: return 2 else: return 1 def _prepare_header(self): """ :param: :return: """ return { 'cedente_agencia_conta_dv': int(self.order.mode.bank_id.acc_number_dig), 'controle_banco': int(self.order.mode.bank_id.bank_bic), 'arquivo_data_de_geracao': self.data_hoje(), 'arquivo_hora_de_geracao': self.hora_agora(), # TODO: Número sequencial de arquivo 'arquivo_sequencia': int(self.get_file_numeration()), '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_conta_dv': (self.order.mode.bank_id.acc_number_dig), 'cedente_agencia_dv': self.order.mode.bank_id.bra_number_dig, 'cedente_nome': self.order.company_id.legal_name, # DV ag e conta 'cedente_dv_ag_cc': (self.order.mode.bank_id.bra_acc_dig), 'arquivo_codigo': 1, # Remessa/Retorno 'servico_operacao': u'R', 'nome_banco': unicode(self.order.mode.bank_id.bank_name), } def get_file_numeration(self): numero = self.order.get_next_number() if not numero: numero = 1 return numero def format_date(self, srt_date): return int( datetime.datetime.strptime(srt_date, '%Y-%m-%d').strftime('%d%m%Y')) def nosso_numero(self, format): pass def cep(self, format): sulfixo = format[-3:] prefixo = format[:5] return prefixo, sulfixo def sacado_inscricao_tipo(self, partner_id): # TODO: Implementar codigo para PIS/PASEP if partner_id.is_company: return 2 else: return 1 def rmchar(self, format): return re.sub('[%s]' % re.escape(string.punctuation), '', format or '') def _prepare_segmento(self, line): """ :param line: :return: """ prefixo, sulfixo = self.cep(line.partner_id.zip) aceite = u'N' if not self.order.mode.boleto_aceite == 'S': aceite = u'A' # Código agencia do cedente # cedente_agencia = cedente_agencia # Dígito verificador da agência do cedente # cedente_agencia_conta_dv = cedente_agencia_dv # Código da conta corrente do cedente # cedente_conta = cedente_conta # Dígito verificador da conta corrente do cedente # cedente_conta_dv = cedente_conta_dv # Dígito verificador de agencia e conta # Era cedente_agencia_conta_dv agora é cedente_dv_ag_cc return { 'cedente_agencia_conta_dv': int(self.order.mode.bank_id.acc_number_dig), 'controle_banco': int(self.order.mode.bank_id.bank_bic), 'cedente_agencia': int(self.order.mode.bank_id.bra_number), 'cedente_conta': int(self.order.mode.bank_id.acc_number), 'cedente_conta_dv': self.order.mode.bank_id.acc_number_dig, 'cedente_agencia_dv': self.order.mode.bank_id.bra_number_dig, 'cedente_nome': self.order.company_id.legal_name, # DV ag e cc 'cedente_dv_ag_cc': (self.order.mode.bank_id.acc_number_dig), 'identificacao_titulo': line.move_line_id.name, # 25 chars limit 'identificacao_titulo_banco': u'0000000', # TODO 'identificacao_titulo_empresa': line.move_line_id.move_id.name, 'numero_documento': line.move_line_id.transaction_ref, # 10 chars limit 'vencimento_titulo': self.format_date(line.ml_maturity_date), 'valor_titulo': Decimal(str(line.amount_currency)).quantize(Decimal('1.00')), # TODO: Código adotado para identificar o título de cobrança. # 8 é Nota de cŕedito comercial 'especie_titulo': int(self.order.mode.boleto_especie), 'aceite_titulo': aceite, 'data_emissao_titulo': self.format_date(line.ml_date_created), # Taxa de juros do Odoo padrão mensal: 2. Campo 27.3P # CEF/FEBRABAN e Itaú não tem. 'codigo_juros': 2, 'juros_mora_data': self.format_date(line.ml_maturity_date), 'juros_mora_taxa': Decimal(str(self.order.mode.late_payment_interest)).quantize( Decimal('1.00')), # Multa padrão em percentual no Odoo, valor '2' 'codigo_multa': '2', 'data_multa': self.format_date(line.ml_maturity_date), 'juros_multa': Decimal(str(self.order.mode.late_payment_fee)).quantize( Decimal('1.00')), # TODO Remover taxa dia - deixar apenas taxa normal 'juros_mora_taxa_dia': Decimal('0.00'), 'valor_abatimento': Decimal('0.00'), 'sacado_inscricao_tipo': int(self.sacado_inscricao_tipo(line.partner_id)), 'sacado_inscricao_numero': int(self.rmchar(line.partner_id.cnpj_cpf)), 'sacado_nome': line.partner_id.legal_name, 'sacado_endereco': (line.partner_id.street + ' ' + line.partner_id.number), 'sacado_bairro': line.partner_id.district, 'sacado_cep': int(prefixo), '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': int(self.order.mode.boleto_protesto), 'prazo_protesto': int(self.order.mode.boleto_protesto_prazo), 'codigo_baixa': 2, 'prazo_baixa': 0, # De 5 a 120 dias. 'controlecob_data_gravacao': self.data_hoje(), 'cobranca_carteira': int(self.order.mode.boleto_carteira), } def remessa(self, order): """ :param order: :return: """ cobrancasimples_valor_titulos = 0 self.order = order self.arquivo = Arquivo(self.bank, **self._prepare_header()) for line in order.line_ids: self.arquivo.incluir_cobranca(**self._prepare_segmento(line)) self.arquivo.lotes[0].header.servico_servico = 1 # TODO: tratar soma de tipos de cobranca cobrancasimples_valor_titulos += line.amount_currency # fixed 'quantidade_registros' in trailer to 000001 self.arquivo.lotes[0].trailer.cobrancasimples_valor_titulos = \ Decimal(cobrancasimples_valor_titulos).quantize( Decimal('1.00')) remessa = unicode(self.arquivo) return unicodedata.normalize('NFKD', remessa).encode('ascii', 'ignore') def data_hoje(self): return (int(time.strftime("%d%m%Y"))) def hora_agora(self): return (int(time.strftime("%H%M%S")))
class Cnab240(Cnab): """ """ def __init__(self): super(Cnab, self).__init__() @staticmethod def get_bank(bank): if bank == '341': from .bancos.itau import Itau240 return Itau240 elif bank == '237': from .bancos.bradesco import Bradesco240 return Bradesco240 elif bank == '104': from .bancos.cef import Cef240 return Cef240 elif bank == '033': from .bancos.santander import Santander240 return Santander240 else: return Cnab240 def nosso_numero(self, format): return format def _prepare_header(self, arquivo_codigo, controle_banco, cedente_agencia, cedente_agencia_dv, cedente_conta, cedente_conta_dv, cedente_dv_ag_cc, cedente_inscricao_numero, cedente_inscricao_tipo, cedente_nome, nome_banco, servico_operacao, arquivo_sequencia, arquivo_data_de_geracao=False, arquivo_hora_de_geracao=False, **kwargs): """ :param: :return: """ return { 'controle_banco': controle_banco, 'arquivo_data_de_geracao': arquivo_data_de_geracao or self.data_hoje(), 'arquivo_hora_de_geracao': arquivo_hora_de_geracao or self.hora_agora(), # TODO: Número sequencial de arquivo 'arquivo_sequencia': int(arquivo_sequencia), 'cedente_inscricao_tipo': int(self.inscricao_tipo(cedente_inscricao_numero)), 'cedente_inscricao_numero': int(self.punctuation_rm(cedente_inscricao_numero)), 'cedente_agencia': int(cedente_agencia), 'cedente_conta': int(cedente_conta), 'cedente_conta_dv': cedente_conta_dv, 'cedente_agencia_dv': cedente_agencia_dv, 'cedente_nome': cedente_nome, # DV ag e conta 'cedente_dv_ag_cc': cedente_dv_ag_cc, 'arquivo_codigo': 1, # Remessa/Retorno 'servico_operacao': unicode(servico_operacao), 'nome_banco': unicode(nome_banco), } def _prepare_segmento(self, line): """ :param line: :return: """ prefixo, sulfixo = self.cep(line.sacado_cep) aceite = u'N' if not line.aceite == 'S': aceite = u'A' # Código agencia do cedente # cedente_agencia = cedente_agencia # Dígito verificador da agência do cedente # cedente_agencia_conta_dv = cedente_agencia_dv # Código da conta corrente do cedente # cedente_conta = cedente_conta # Dígito verificador da conta corrente do cedente # cedente_conta_dv = cedente_conta_dv # Dígito verificador de agencia e conta # Era cedente_agencia_conta_dv agora é cedente_dv_ag_cc return { # TODO: Esses dados podem ser de outras filiais e contas # provavelmente, então pode ser que teremos que refazer este # trecho. 'controle_banco': self.arquivo.header.controle_banco, 'cedente_agencia': self.arquivo.header.cedente_agencia, 'cedente_conta': self.arquivo.header.cedente_conta, 'cedente_conta_dv': self.arquivo.header.cedente_conta_dv, 'cedente_agencia_dv': self.arquivo.header.cedente_agencia_dv, 'cedente_dv_ag_cc': self.arquivo.header.cedente_dv_ag_cc, 'identificacao_titulo': u'0000000', # TODO 'identificacao_titulo_banco': u'0000000', # TODO 'identificacao_titulo_empresa': line.nosso_numero, 'numero_documento': line.numero_documento, 'vencimento_titulo': self.format_date(line.data_vencimento), 'valor_titulo': Decimal(line.valor_documento).quantize(Decimal('1.00')), # TODO: Código adotado para identificar o título de cobrança. # 8 é Nota de cŕedito comercial 'especie_titulo': 8, # FIXME #int(self.order.mode.boleto_especie), 'aceite_titulo': aceite, 'data_emissao_titulo': self.format_date(line.data_documento), # TODO: trazer taxa de juros do Odoo. Depende do valor do 27.3P # CEF/FEBRABAN e Itaú não tem. 'juros_mora_data': self.format_date(line.data_vencimento), # FIXME 'juros_mora_taxa_dia': Decimal('0.00'), # FIXME 'valor_abatimento': Decimal('0.00'), # FIXME 'sacado_inscricao_tipo': int(self.inscricao_tipo(line.sacado_documento)), 'sacado_inscricao_numero': int(self.punctuation_rm(line.sacado_documento)), 'sacado_nome': line.sacado_nome, 'sacado_endereco': line.sacado_endereco, 'sacado_bairro': line.sacado_bairro, 'sacado_cep': int(prefixo), 'sacado_cep_sufixo': int(sulfixo), 'sacado_cidade': line.sacado_cidade, 'sacado_uf': line.sacado_uf, 'codigo_protesto': 1, #int(self.order.mode.boleto_protesto), 'prazo_protesto': 1, #int(self.order.mode.boleto_protesto_prazo), 'codigo_baixa': 2, 'prazo_baixa': 0, # De 5 a 120 dias. 'controlecob_data_gravacao': self.data_hoje(), 'cobranca_carteira': int(line.carteira), } def remessa(self, header, lista_boletos): """ :param order: :return: """ cobrancasimples_valor_titulos = Decimal(0.00) self.arquivo = Arquivo(self.bank, **self._prepare_header(**header)) for line in lista_boletos: self.arquivo.incluir_cobranca(**self._prepare_segmento(line)) self.arquivo.lotes[0].header.servico_servico = 1 # TODO: tratar soma de tipos de cobranca # TODO: Verificar se é o valor do documento ou o valor cobrancasimples_valor_titulos += Decimal(line.valor_documento) self.arquivo.lotes[0].trailer.cobrancasimples_valor_titulos = \ Decimal(cobrancasimples_valor_titulos).quantize( Decimal('1.00')) remessa = unicode(self.arquivo) return unicodedata.normalize('NFKD', remessa).encode('ascii', 'ignore')
def montarArquivo(self, cr, uid, ids, context=None): res = {} cnab_data = dict() for obj_id in self.browse(cr, uid, ids, context): # exportation_bank = obj_id.codigo_banco exportation_bank = u'341' segmento_pool = self.pool.get('cnab240export.segmentos') ids_segmentos = segmento_pool.search(cr, uid, [('arquivo_id', 'in', ids)]) #itau_data = dict() #itau_data['arquivo'] = dict_arquivo #itau_data['cobranca'] = dict_cobranca #arquivo = Arquivo(itau, **itau_data['arquivo']) #arquivo.incluir_cobranca(**itau_data['cobranca']) #arquivo.lotes[0].header.servico_servico = 1 # Header dict_arquivo = self.get_cnab_header_data(cr, uid, ids, context) cnab_data['arquivo'] = dict_arquivo if exportation_bank == u'104': arquivo = Arquivo(itau, **cnab_data['arquivo']) elif exportation_bank == u'341': arquivo = Arquivo(itau, **cnab_data['arquivo']) #cnab_data['cobranca'] = dict_cobranca #arquivo.incluir_cobranca(**cnab_data['cobranca']) for seg in ids_segmentos: #pdb.set_trace() segmento_cobranca = self.get_cnab_segmento_data( cr, uid, seg, context) #cedente_nome = obj_id.cedente_nome #cedente_inscricao_numero = obj_id.cedente_inscricao_numero #cedente_inscricao_tipo = obj_id.cedente_inscricao_tipo #cedente_agencia = obj_id.cedente_agencia #cedente_conta = obj_id.cedente_conta #cedente_agencia_conta_dv = obj_id.cedente_agencia_digito #cedente_codigo_codCedente = obj_id.cedente_codCedente #nome_do_banco = obj_id.nome_do_banco #arquivo_sequencia = int(obj_id.arquivo_sequencia) segmento_cobranca['cedente_nome'] = dict_arquivo.get( 'cedente_nome') segmento_cobranca['cedente_inscricao_numero'] = dict_arquivo.get( 'cedente_inscricao_numero') segmento_cobranca['cedente_inscricao_tipo'] = dict_arquivo.get( 'cedente_inscricao_tipo') segmento_cobranca['cedente_agencia'] = dict_arquivo.get( 'cedente_agencia') segmento_cobranca['cedente_conta'] = dict_arquivo.get( 'cedente_conta') segmento_cobranca['cedente_agencia_conta_dv'] = dict_arquivo.get( 'cedente_agencia_conta_dv') #segmento_cobranca['dente_codCedente'] = dict_arquivo.get('cedente_codCedente') #segmento_cobranca['nome_do_banco'] = dict_arquivo.get('nome_do_banco') #segmento_cobranca[''] = dict_arquivo.get('') cnab_data['cobranca'] = segmento_cobranca arquivo.incluir_cobranca(**cnab_data['cobranca']) arquivo.lotes[0].header.servico_servico = 1 str = unicode(arquivo) f = open('/tmp/arquivo_remessa.rem', 'w') f.write(str) # python will convert \n to os.linesep f.close() return True
def montarArquivo(self, cr, uid, ids, context=None): res = {} cnab_data = dict() for obj_id in self.browse(cr, uid, ids, context): # exportation_bank = obj_id.codigo_banco exportation_bank = u'341' segmento_pool = self.pool.get('cnab240export.segmentos') ids_segmentos = segmento_pool.search( cr, uid, [('arquivo_id', 'in', ids)]) #itau_data = dict() #itau_data['arquivo'] = dict_arquivo #itau_data['cobranca'] = dict_cobranca #arquivo = Arquivo(itau, **itau_data['arquivo']) #arquivo.incluir_cobranca(**itau_data['cobranca']) #arquivo.lotes[0].header.servico_servico = 1 # Header dict_arquivo = self.get_cnab_header_data(cr, uid, ids, context) cnab_data['arquivo'] = dict_arquivo if exportation_bank == u'104': arquivo = Arquivo(itau, **cnab_data['arquivo']) elif exportation_bank == u'341': arquivo = Arquivo(itau, **cnab_data['arquivo']) #cnab_data['cobranca'] = dict_cobranca #arquivo.incluir_cobranca(**cnab_data['cobranca']) for seg in ids_segmentos: #pdb.set_trace() segmento_cobranca = self.get_cnab_segmento_data(cr, uid, seg, context) #cedente_nome = obj_id.cedente_nome #cedente_inscricao_numero = obj_id.cedente_inscricao_numero #cedente_inscricao_tipo = obj_id.cedente_inscricao_tipo #cedente_agencia = obj_id.cedente_agencia #cedente_conta = obj_id.cedente_conta #cedente_agencia_conta_dv = obj_id.cedente_agencia_digito #cedente_codigo_codCedente = obj_id.cedente_codCedente #nome_do_banco = obj_id.nome_do_banco #arquivo_sequencia = int(obj_id.arquivo_sequencia) segmento_cobranca['cedente_nome'] = dict_arquivo.get('cedente_nome') segmento_cobranca['cedente_inscricao_numero'] = dict_arquivo.get('cedente_inscricao_numero') segmento_cobranca['cedente_inscricao_tipo'] = dict_arquivo.get('cedente_inscricao_tipo') segmento_cobranca['cedente_agencia'] = dict_arquivo.get('cedente_agencia') segmento_cobranca['cedente_conta'] = dict_arquivo.get('cedente_conta') segmento_cobranca['cedente_agencia_conta_dv'] = dict_arquivo.get('cedente_agencia_conta_dv') #segmento_cobranca['dente_codCedente'] = dict_arquivo.get('cedente_codCedente') #segmento_cobranca['nome_do_banco'] = dict_arquivo.get('nome_do_banco') #segmento_cobranca[''] = dict_arquivo.get('') cnab_data['cobranca'] = segmento_cobranca arquivo.incluir_cobranca(**cnab_data['cobranca']) arquivo.lotes[0].header.servico_servico = 1 str = unicode(arquivo) f = open('/tmp/arquivo_remessa.rem','w') f.write(str) # python will convert \n to os.linesep f.close() return True
def gerar_arquivo_remessa(modeladmin, request, queryset): from boleto.models import Conta from decimal import Decimal from cnab240.bancos import santander from cnab240.tipos import Arquivo conta = Conta.objects.all()[0] # data_documento = datetime.today().date() ultimo = conta.numero_documento dict_arquivo = { 'cedente_inscricao_tipo': 2, 'cedente_inscricao_numero': 34117705000105, #'cedente_inscricao_numero': int(conta.cedente_documento), 'cedente_agencia': conta.agencia_cedente, 'cedente_conta': conta.conta_cedente, 'cedente_agencia_conta_dv': conta.digito_agencia_cedente, 'cedente_nome': remover_acentos(conta.cedente), 'arquivo_data_de_geracao': int(date.today().strftime('%d%m%Y')), 'arquivo_hora_de_geracao': int(datetime.now().time().strftime('%H%M%S')), 'arquivo_sequencia': conta.cedente_seguencia_arquivo + 1, 'codigo_transmissao': int(conta.codigo_transmissao), 'codigo_remessa': 1, 'controlecob_data_gravacao': int(date.today().strftime('%d%m%Y')) } arquivo = Arquivo(santander, **dict_arquivo) for boleto in queryset: ultimo = ultimo + 1 if True: data_multa = boleto.data_vencimento + relativedelta(days=+1) if boleto.sacado_cep == 'nan': cep = '22261-010' else: cep = boleto.sacado_cep dict_cobranca = { 'cedente_agencia': int(conta.agencia_cedente), 'cedente_conta': int(conta.conta_cedente), 'cedente_conta_dv': int(conta.digito_conta_cedente), 'conta_cobranca': int(conta.conta_cobranca), 'conta_cobranca_dv': int(conta.digito_conta_cobranca), 'cedente_agencia_conta_dv': conta.digito_agencia_cedente, 'carteira_numero': conta.carteira_remessa, 'nosso_numero': int("%s%s" % (boleto.numero_documento, modulo11(boleto.numero_documento))), 'numero_documento': '34117705/0001-0', #'numero_documento': boleto.cedente_documento, 'vencimento_titulo': int(boleto.data_vencimento.strftime('%d%m%Y')), 'valor_titulo': Decimal(boleto.valor_documento), 'especie_titulo': conta.especie_documento, 'aceite_titulo': conta.aceite, 'data_emissao_titulo': int(date.today().strftime('%d%m%Y')), 'codigo_juros': conta.codigo_juros, 'juros_mora_data': int(boleto.data_vencimento.strftime('%d%m%Y')), 'juros_mora_taxa': Decimal( round( boleto.valor_documento * boleto.juros_mora_taxa / 100, 2)), 'identificacao_titulo': boleto.numero_documento, 'codigo_protesto': 3, 'prazo_protesto': 0, 'codigo_baixa': conta.codigo_baixa, 'prazo_baixa': conta.prazo_baixa, 'sacador_inscricao_tipo': 0, 'sacado_inscricao_tipo': 1, 'carne_identificador': 000, 'sacado_inscricao_numero': int(boleto.sacado_documento), 'sacado_nome': remover_acentos(boleto.sacado_nome), 'sacado_endereco': remover_acentos(boleto.sacado_endereco), 'sacado_bairro': remover_acentos(boleto.sacado_bairro), 'sacado_cep': int(cep[:5]), 'sacado_cep_sufixo': int(cep[-3:]), 'sacado_cidade': remover_acentos(boleto.sacado_cidade), 'sacado_uf': boleto.sacado_uf, 'codigo_multa': conta.codigo_multa, 'data_multa': int(data_multa.strftime('%d%m%Y')), 'juros_multa': conta.multa, } arquivo.incluir_cobranca(dict_arquivo, **dict_cobranca) conta.cedente_seguencia_arquivo = conta.cedente_seguencia_arquivo + 1 conta.save() response = HttpResponse(content_type='text/plain') response['Content-Disposition'] = 'attachment; filename=%s' % ( u'remessa_%s.txt' % (date.today().strftime('%Y%m%d'), ), ) response.write(arquivo) return response