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
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
 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]
Beispiel #11
0
 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
Beispiel #12
0
 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)
Beispiel #13
0
    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
Beispiel #14
0
    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')
Beispiel #15
0
    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')
Beispiel #17
0
 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)
Beispiel #20
0
    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])
Beispiel #21
0
 def test_empty_data(self):
     arquivo = Arquivo(itau)
     self.assertRaises(errors.ArquivoVazioError, str, arquivo)
Beispiel #22
0
    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
Beispiel #23
0
 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'])
Beispiel #25
0
    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]
        )
Beispiel #26
0
 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]
Beispiel #29
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