Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
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()
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
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))
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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")))
Ejemplo n.º 8
0
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')
Ejemplo n.º 9
0
    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
Ejemplo n.º 10
0
    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
Ejemplo n.º 11
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