def _parse(self, *args, **kwargs): """Launch the parsing itself.""" cnab240_file = tempfile.NamedTemporaryFile() 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({ 'name': evento.sacado_nome, '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, }) self.result_row_list = res return True
def remessa(self, order): """ :param order: :return: """ cobrancasimples_valor_titulos = 0 self.order = order header = self._prepare_header() self.arquivo = Arquivo(self.bank, **header) for line in order.line_ids: if line.payment_mode_id.bank_account_id.bank_id.bic == '755': self.nosso_numero_with_dv = line.nosso_numero + line.nosso_numero_dv else: self.nosso_numero_with_dv = line.nosso_numero print self.nosso_numero print self.nosso_numero_with_dv seg = self._prepare_segmento(line.move_line_id) print seg 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.move_line_id.amount_currency self.arquivo.lotes[0].trailer.cobrancasimples_valor_titulos = \ Decimal(cobrancasimples_valor_titulos).quantize( Decimal('1.00')) return unicode(self.arquivo)
def remessa(self, order): """ :param order: :return: """ cobrancasimples_valor_titulos = 0 self.order = order header = self._prepare_header() self.arquivo = Arquivo(self.bank, **header) # for line in order.line_ids: if line.validate_line_to_export(): seg = self._prepare_segmento(line.move_line_id) 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.value self.arquivo.lotes[0].trailer.cobrancasimples_valor_titulos = \ Decimal(cobrancasimples_valor_titulos).quantize( Decimal('1.00')) year = str(datetime.datetime.now().year)[2:] # add year in nosso_numero because we pass it to bank # and this is used to loacate payment order line while # importing bank return if line.nosso_numero[:2] != year: line.nosso_numero = year + str(line.nosso_numero) line.state = 'ag' return unicode(self.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
def _get_account(self, cnab_file): if self.cnab_type != 'receivable': return super(L10nBrPaymentCnabImport, self)._get_account(cnab_file) stream = StringIO(cnab_file.decode('ascii')) bank = get_bank(self.journal_id.bank_id.bic) cnab = Arquivo(bank, arquivo=stream) return cnab.header.cedente_conta, cnab.header.cedente_agencia
def _check_cnab(self, data_file, raise_error=False): try: cnab240_file = tempfile.NamedTemporaryFile() cnab240_file.write(data_file) cnab240_file.flush() Arquivo(sicoob, arquivo=open(cnab240_file.name, 'r')) return True except Exception as e: if raise_error: raise UserError(u"Arquivo formato inválido:\n%s" % str(e)) return False
def processa_pagamentos(data): arquivo = Arquivo(banco_brasil, **data) pagamentos = data.get('pagamentos') valor_total = Decimal(0.0) # "arquivo_data_de_geracao": "01041990", # "arquivo_hora_de_geracao": "235959", for pagamento in pagamentos: arquivo.incluir_pagamentos_diversos(**data, **pagamento) valor_total += Decimal(pagamento.get('valor', 0.0)) arquivo.lotes[0].trailer.somatorio_valor = valor_total return str(arquivo)
def _parse_cnab(self, data_file, raise_error=False): cnab240_file = tempfile.NamedTemporaryFile() cnab240_file.write(data_file) cnab240_file.flush() arquivo = Arquivo(sicoob, arquivo=open(cnab240_file.name, 'r')) transacoes = [] for lote in arquivo.lotes: for evento in lote.eventos: valor = evento.valor_lancamento if evento.tipo_lancamento == 'D': valor *= -1 transacoes.append({ 'name': evento.descricao_historico, 'date': datetime.strptime(str(evento.data_lancamento), '%d%m%Y'), 'amount': valor, 'partner_name': evento.cedente_nome, 'ref': evento.numero_documento, 'unique_import_id': str(evento.servico_numero_registro), }) header = arquivo.lotes[0].header trailer = arquivo.lotes[0].trailer inicio = datetime.strptime(str(header.data_saldo_inicial), '%d%m%Y') final = datetime.strptime(str(trailer.data_saldo_final), '%d%m%Y') vals_bank_statement = { 'name': u"%s - %s até %s" % (arquivo.header.nome_do_banco, inicio.strftime('%d/%m/%Y'), final.strftime('%d/%m/%Y')), 'date': inicio, 'balance_start': arquivo.lotes[0].header.valor_saldo_inicial, 'balance_end_real': arquivo.lotes[0].trailer.valor_saldo_final, 'transactions': transacoes } account_number = str(arquivo.header.cedente_conta) if self.force_journal_account: account_number = self.journal_id.bank_acc_number return (arquivo.lotes[0].header.moeda, account_number, [vals_bank_statement])
def parse(self, data, banco_impt): """Launch the parsing itself.""" cnab240_file = tempfile.NamedTemporaryFile() cnab240_file.seek(0) cnab240_file.write(data) cnab240_file.flush() ret_file = codecs.open(cnab240_file.name, encoding='ascii') # Nome_modo_impt é o nome da pasta do json. Código do banco é inválido # nessa situação arquivo = Arquivo((self.determine_bank(banco_impt)), arquivo=ret_file) cnab240_file.close() transacoes = [] total_amt = Decimal(0.00) for lote in arquivo.lotes: for evento in lote.eventos: vals = { 'name': evento.sacado_nome, 'amount': evento.valor_titulo, 'ref': evento.numero_documento, 'label': evento.sacado_inscricao_numero, # cnpj 'transaction_id': evento.numero_documento, # nosso numero, Alfanumérico 'unique_import_id': evento.nosso_numero, } if evento.vencimento_titulo: vals['date'] = datetime.datetime.strptime( str(evento.vencimento_titulo), '%d%m%Y') transacoes.append(vals) total_amt += evento.valor_titulo vals_bank_statement = { 'name': '%s - %s' % (arquivo.header.nome_do_banco, arquivo.header.arquivo_data_de_geracao), 'date': datetime.datetime.strptime( str(arquivo.header.arquivo_data_de_geracao), '%d%m%Y'), 'balance_start': 0.00, 'balance_end_real': total_amt, 'currency_code': u'BRL', # Código da moeda 'account_number': arquivo.header.cedente_conta, 'transactions': transacoes } return [vals_bank_statement]
def _check_cnab(self, data_file, raise_error=False): try: cnab240_file = tempfile.NamedTemporaryFile() cnab240_file.write(data_file) cnab240_file.flush() arquivo = open(cnab240_file.name, 'r') # read 1st 3 chars of 1st line from file bank_code = arquivo.readline()[0:3] bank = self.determine_bank(bank_code) Arquivo(bank, arquivo=open(cnab240_file.name, 'r')) return True except Exception as e: if raise_error: raise UserError(u"Arquivo formato inválido:\n%s" % str(e)) return False
def remessa(self, order): cobrancasimples_valor_titulos = 0 self.order = order header = self._prepare_header() self.arquivo = Arquivo(self.bank, **header) for line in order.line_ids: seg = self._prepare_segmento(line.move_line_id) 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.move_line_id.amount_currency self.arquivo.lotes[0].trailer.cobrancasimples_valor_titulos = \ Decimal(cobrancasimples_valor_titulos).quantize( Decimal('1.00')) return str(self.arquivo)
def _check_cnab(self, data_file, raise_error=False): try: cnab240_file = tempfile.NamedTemporaryFile() cnab240_file.write(data_file) cnab240_file.flush() journal_id = self.env.context['journal_id'] if self.force_journal_account: journal_id = self.journal_id.id bank = self.get_bank(journal_id) Arquivo(bank, arquivo=open(cnab240_file.name, 'r')) return True except Exception as e: if raise_error: raise UserError(u"Arquivo formato inválido:\n%s" % str(e)) return False
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 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 remessa(self, order): """ :param order: :return: """ pag_valor_titulos = 0 self.order = order self.arquivo = Arquivo(self.bank, **self._prepare_header()) cont_lote = 0 for line in order.line_ids: self.arquivo.incluir_pagamento(**self.incluir_pagamento_for(line)) pag_valor_titulos += line.amount_currency self.arquivo.trailer.total_valor_arq = Decimal( pag_valor_titulos).quantize(Decimal('1.00')) self.arquivo.trailer.sequencial_transacao = self.controle_linha cont_lote += 1 remessa = unicode(self.arquivo) return unicodedata.normalize('NFKD', remessa).encode('ascii', 'ignore')
def setUp(self): self.santander_data = get_santander_data_from_dict() self.arquivo = Arquivo(santander, **self.santander_data['arquivo'])
def parse(self, data, banco_impt): """Launch the parsing itself.""" cnab240_file = tempfile.NamedTemporaryFile() cnab240_file.seek(0) cnab240_file.write(data) cnab240_file.flush() ret_file = codecs.open(cnab240_file.name, encoding='ascii') # Nome_modo_impt é o nome da pasta do json. Código do banco é inválido # nessa situação arquivo = Arquivo((self.determine_bank(banco_impt)), arquivo=ret_file) cnab240_file.close() transacoes = [] total_amt = Decimal(0.00) for lote in arquivo.lotes: for evento in lote.eventos: if evento.servico_segmento == 'T': transacoes.append({ 'name': evento.sacado_nome, 'date': datetime.datetime.strptime( str(evento.vencimento_titulo).zfill(8), '%d%m%Y').date(), 'amount': evento.valor_titulo, 'ref': evento.numero_documento, 'label': evento.sacado_inscricao_numero, # cnpj 'transaction_id': evento.numero_documento, # nosso numero, Alfanumérico 'unique_import_id': str(arquivo.header.arquivo_sequencia) + '-' + str(evento.numero_documento), 'servico_codigo_movimento': evento.servico_codigo_movimento, 'errors': evento.motivo_ocorrencia # 214-221 }) else: # set amount and data_ocorrencia from segment U, it has with juros # Formula: # amount = base_value + interest - (discount + rebate) base_value = transacoes[-1]['amount'] interest = evento.titulo_acrescimos discount = evento.titulo_desconto rebate = evento.titulo_abatimento if evento.servico_segmento == 'U': transacoes[-1]['amount'] = base_value + interest - ( discount + rebate) # replace vencimento with data_ocorrencia transacoes[-1]['date'] = datetime.datetime.strptime( str(evento.data_ocorrencia).zfill(8), '%d%m%Y') total_amt += evento.titulo_liquido vals_bank_statement = { 'name': '%s - %s' % (arquivo.header.nome_do_banco, arquivo.header.arquivo_data_de_geracao), 'date': datetime.datetime.strptime( str(arquivo.header.arquivo_data_de_geracao).zfill(8), '%d%m%Y'), 'balance_start': 0.00, 'balance_end_real': total_amt, 'currency_code': u'BRL', # Código da moeda 'account_number': arquivo.header.cedente_conta, 'transactions': transacoes } return [vals_bank_statement]
def test_empty_data(self): arquivo = Arquivo(bancodobrasil) self.assertRaises(errors.ArquivoVazioError, str, arquivo)
def _parse_cnab(self, data_file, raise_error=False): cnab240_file = tempfile.NamedTemporaryFile() cnab240_file.write(data_file) # data file is string here bank_code = data_file[0:3] bank = self.determine_bank(bank_code) cnab240_file.flush() arquivo = Arquivo(bank, arquivo=open(cnab240_file.name, 'r')) transacoes = [] total_amt = Decimal(0.00) for lote in arquivo.lotes: if bank != itau: for evento in lote.eventos: valor = evento.valor_lancamento if evento.tipo_lancamento == 'D': valor *= -1 transacoes.append({ 'name': evento.descricao_historico, 'date': datetime.strptime(str(evento.data_lancamento), '%d%m%Y'), 'amount': valor, 'partner_name': evento.cedente_nome, 'ref': evento.numero_documento, 'unique_import_id': str(evento.servico_numero_registro), }) header = arquivo.lotes[0].header trailer = arquivo.lotes[0].trailer inicio = datetime.strptime(str(header.data_saldo_inicial), '%d%m%Y') final = datetime.strptime(str(trailer.data_saldo_final), '%d%m%Y') name = u"%s - %s até %s" % (arquivo.header.nome_do_banco, inicio.strftime('%d/%m/%Y'), final.strftime('%d/%m/%Y')), start_date = inicio balance_start = arquivo.lotes[0].header.valor_saldo_inicial balance_end_real = arquivo.lotes[0].trailer.valor_saldo_final if bank == itau: for evento in lote.eventos: if evento.servico_segmento == 'T': transacoes.append({ 'name': evento.sacado_nome, 'date': datetime.strptime( str(evento.vencimento_titulo).zfill(8), '%d%m%Y').date(), 'amount': evento.valor_titulo, 'ref': evento.numero_documento, 'label': evento.sacado_inscricao_numero, # cnpj 'transaction_id': evento.numero_documento, # nosso numero, Alfanumérico 'unique_import_id': str(arquivo.header.arquivo_sequencia) + '-' + str(evento.numero_documento), 'servico_codigo_movimento': evento.servico_codigo_movimento, 'errors': evento.motivo_ocorrencia # 214-221 }) else: # set amount and data_ocorrencia from segment U, it has with juros # Formula: # amount = base_value + interest - (discount + rebate) base_value = transacoes[-1]['amount'] interest = evento.titulo_acrescimos discount = evento.titulo_desconto rebate = evento.titulo_abatimento if evento.servico_segmento == 'U': transacoes[-1][ 'amount'] = base_value + interest - (discount + rebate) # replace vencimento with data_ocorrencia transacoes[-1]['date'] = datetime.strptime( str(evento.data_ocorrencia).zfill(8), '%d%m%Y') total_amt += evento.titulo_liquido name = u'%s - %s' % (arquivo.header.nome_do_banco, arquivo.header.arquivo_data_de_geracao) start_date = datetime.strptime( str(arquivo.header.arquivo_data_de_geracao).zfill(8), '%d%m%Y') balance_start = 0.0 balance_end_real = total_amt vals_bank_statement = { 'name': name, 'date': start_date, 'balance_start': balance_start, 'balance_end_real': balance_end_real, 'transactions': transacoes, 'currency_code': u'BRL', 'account_number': arquivo.header.cedente_conta, 'bank_code': bank_code, } account_number = str(arquivo.header.cedente_conta) if self.force_journal_account: account_number = self.journal_id.bank_acc_number return (u'BRL', account_number, [vals_bank_statement])
def test_empty_data(self): arquivo = Arquivo(itau) self.assertRaises(errors.ArquivoVazioError, str, arquivo)
def _parse_cnab(self, data_file, raise_error=False): """ LEIO os dados aqui mas o tipo 9 nao vem res = super(AccountBankStatementImport, self)._parse_cnab(data_file, raise_error) x,y,z = res tr = z[0]['transactions'] for ln in tr: print ln['name'] print ln['partner_name'] print ln['ref'] """ cnab240_file = tempfile.NamedTemporaryFile() cnab240_file.write(data_file) cnab240_file.flush() #arquivo = Arquivo(sicoob, arquivo=open(cnab240_file.name, 'r')) arquivo = Arquivo(itau, arquivo=open(cnab240_file.name, 'r')) transacoes = [] inicio = datetime.strptime(str(arquivo.header.arquivo_data_de_geracao), '%d%m%Y') final = datetime.strptime(str(arquivo.header.arquivo_data_de_geracao), '%d%m%Y') #import pudb;pu.db cod_arquivo = str(arquivo.header.arquivo_sequencia + arquivo.header.cedente_conta) n_arq = '%s - %s - %s' % (arquivo.header.cedente_conta, inicio.strftime('%d/%m/%Y'), final.strftime('%d/%m/%Y')) company_id = 1 if self.force_journal_account: if not self.journal_id.company_id: raise UserError(u"Informe a Empresa na Conta Selecionada") company_id = str(self.journal_id.company_id.id) else: raise UserError(u"Informe a Conta") len_company = len(company_id) for lote in arquivo.lotes: for evento in lote.eventos: if evento.servico_codigo_movimento not in (6, 8, 9, 10): continue n_doc = '0' if evento.numero_documento: c_doc = len(evento.numero_documento) if c_doc > 7: try: pos_doc = evento.numero_documento.index('/') n_doc = evento.numero_documento[:pos_doc] # coloquei aqui pois os titulos velhos nao tem a empresa na frente if company_id != n_doc[:len_company]: continue except: n_doc = evento.numero_documento else: n_doc = evento.numero_documento prt = self.env['account.invoice'].search( [('number', 'ilike', evento.numero_documento)], limit=1) prt_id = 0 if prt: sacado = prt.partner_id.name prt_id = prt.partner_id.id else: sacado = evento.sacado_nome if evento.servico_codigo_movimento == 9: self._alterar_status_fatura(prt.id, n_arq) continue #valor = evento.valor_lancamento valor = evento.valor_titulo #if evento.tipo_lancamento == 'D': # valor *= -1 if evento.data_credito == 0: dta_credito = evento.data_ocorrencia else: dta_credito = evento.data_credito cod_arquivo += n_doc transacoes.append({ 'name': n_doc, 'date': datetime.strptime(str(dta_credito), '%d%m%Y'), 'amount': valor, 'partner_name': sacado, 'ref': n_doc, 'unique_import_id': str(cod_arquivo), }) header = arquivo.lotes[0].header trailer = arquivo.lotes[0].trailer vals_bank_statement = { 'name': u"%s - %s até %s" % (arquivo.header.nome_do_banco, inicio.strftime('%d/%m/%Y'), final.strftime('%d/%m/%Y')), 'date': inicio, 'balance_start': 0.0, # arquivo.lotes[0].header.valor_saldo_inicial, 'balance_end_real': 0.0, #arquivo.lotes[0].trailer.valor_saldo_final, 'transactions': transacoes } account_number = str(arquivo.header.cedente_conta) if self.force_journal_account: account_number = self.journal_id.bank_acc_number return ( 'BRL', #arquivo.lotes[0].header.moeda, account_number, [vals_bank_statement]) return res
def setUp(self): self.bancoob_data = get_bancoob_data_from_dict() self.arquivo = Arquivo(bancoob, **self.bancoob_data['arquivo'])
def setUp(self): self.bancodobrasil_data = get_bancodobrasil_data_from_dict() self.arquivo = Arquivo(bancodobrasil, **self.bancodobrasil_data['arquivo'])
def _parse_cnab(self, data_file, raise_error=False): cnab240_file = tempfile.NamedTemporaryFile() cnab240_file.write(data_file) cnab240_file.flush() journal_id = self.env.context['journal_id'] if self.force_journal_account: journal_id = self.journal_id.id bank = self.get_bank(journal_id) arquivo = Arquivo(bank, arquivo=open(cnab240_file.name, 'r')) transacoes = [] valor_total = Decimal('0.0') for lote in arquivo.lotes: for evento in lote.eventos: valor = evento.titulo_pago # Apenas liquidação (Sicoob:6) # Liquidação Banco do Brasil (6, 17) # Liquidação Bradesco (6, 177) # Liquidação Santander ('06', '17') if evento.servico_codigo_movimento in (6, 17, '06', '17',): valor_total += valor nosso_numero = self._get_nosso_numero( journal_id, evento.nosso_numero) move_line = self.env['account.move.line'].search( [('nosso_numero', '=', nosso_numero)]) transacoes.append({ 'name': "%s : %s" % ( move_line.partner_id.name or evento.sacado_nome, evento.numero_documento or "%s: %s" % ( move_line.move_id.name, move_line.name)), 'date': datetime.strptime( str(evento.data_ocorrencia), '%d%m%Y'), 'amount': valor, 'partner_name': move_line.partner_id.name or evento.sacado_nome, 'partner_id': move_line.partner_id.id, 'ref': evento.numero_documento, 'unique_import_id': str(evento.nosso_numero), 'nosso_numero': nosso_numero, }) inicio = final = datetime.now() if len(transacoes): primeira_transacao = min(transacoes, key=lambda x: x["date"]) ultima_transacao = max(transacoes, key=lambda x: x["date"]) inicio = primeira_transacao["date"] final = ultima_transacao["date"] last_bank_stmt = self.env['account.bank.statement'].search( [('journal_id', '=', journal_id)], order="date desc, id desc", limit=1) last_balance = last_bank_stmt and last_bank_stmt[0].balance_end or 0.0 vals_bank_statement = { 'name': u"%s - %s até %s" % ( arquivo.header.nome_do_banco, inicio.strftime('%d/%m/%Y'), final.strftime('%d/%m/%Y')), 'date': inicio, 'balance_start': last_balance, 'balance_end_real': Decimal(last_balance) + valor_total, 'transactions': transacoes } account_number = '' # str(arquivo.header.cedente_conta) if self.force_journal_account: account_number = self.journal_id.bank_acc_number return ( 'BRL', account_number, [vals_bank_statement] )
def setUp(self): self.itau_data = get_itau_data_from_dict() self.arquivo = Arquivo(itau, **self.itau_data['arquivo'])
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 do_import(self, cnab_file): if self.cnab_type != 'receivable': return super(L10nBrPaymentCnabImport, self).do_import(cnab_file) stream = StringIO(cnab_file.decode('ascii')) bank = get_bank(self.journal_id.bank_id.bic) arquivo = Arquivo(bank, arquivo=stream) sequence = self.journal_id.l10n_br_sequence_statements statement = None for lote in arquivo.lotes: for evento in lote.eventos: if not statement: statement = self.env['l10n_br.payment.statement'].create({ 'journal_id': self.journal_id.id, 'date': date.today(), 'company_id': self.journal_id.company_id.id, 'name': sequence.next_by_id(), 'type': 'receivable', }) code, message = parse_cnab_code( self.journal_id.bank_id.bic, evento.servico_codigo_movimento) payment_line = self.env['payment.order.line'].search([ ('nosso_numero', '=', int(evento.nosso_numero)), ('src_bank_account_id', '=', self.journal_id.bank_account_id.id) ]) due_date = date.today() effective_date = None if evento.vencimento_titulo: due_date = datetime.strptime( "{:08}".format(evento.vencimento_titulo), "%d%m%Y") if evento.data_ocorrencia: effective_date = datetime.strptime( "{:08}".format(evento.data_ocorrencia), "%d%m%Y") vals = { 'nosso_numero': evento.nosso_numero, 'numero_documento': evento.numero_documento, 'sacado_nome': evento.sacado_nome, 'valor_titulo': evento.valor_titulo, 'titulo_acrescimos': evento.titulo_acrescimos, 'titulo_desconto': evento.titulo_desconto, 'titulo_abatimento': evento.titulo_abatimento, 'titulo_pago': evento.titulo_pago, 'valor_tarifas': evento.valor_tarifas, 'titulo_liquido': evento.titulo_liquido, 'vencimento_titulo': due_date, 'data_ocorrencia': effective_date, 'cnab_code': code, 'cnab_message': message, } IMMUTABLE_STATES = ('paid', 'rejected', 'cancelled') if payment_line and payment_line.state in IMMUTABLE_STATES: vals['cnab_message'] = 'Importado previamente' self._create_ignored_line(statement, vals, payment_line) continue if not payment_line: self._create_ignored_line(statement, vals) continue # Process the line payment_line.process_receivable_line(statement, vals) if not statement: raise UserError(_('Nenhum registro localizado nesse extrato!')) action = self.env.ref( 'br_account_payment.action_payment_statement_tree') return action.read()[0]
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