<commit_before>from cnab240.registro import Registro
from datetime import datetime

class Cnab240(object):

    CAMPOS_OBRIGATORIOS = (
        'versao',
        'banco_codigo',
        'banco_nome',
        'cedente_nome',
        'cedente_convenio',
        'cedente_agencia',
        'cedente_agencia_dv',
        'cedente_conta',
        'cedente_conta_dv',
        'cedente_agencia_conta_dv',
        'arquivo_sequencia',
        'arquivo_densidade'
    )

    def __init__(self, **kwargs):
        """
        Argumentos:
        - versao -> Versão do versao_layout
        - cedente_banco_codigo -> Código do banco
        - cedente_banco_nome -> Nome do banco
        - cedente_nome -> Nome do Cedente
        - cedente_numero_documento -> CPF/CNPJ
        - cedente_convenio -> Convênio com o banco
        - cedente_agencia -> Agência bancária
        - cedente_agencia_dv -> Digito verificador da agência
        - cedente_conta -> Conta corrente
        - cedente_conta_dv -> Digito verificador da conta
        - cedente_agencia_conta_dv -> Digito verificador da conta e agência
        - arquivo_sequencia -> Número sequencial do arquivo
        - arquivo_densidade -> Densidade de gravação do arquivo
        """

        if not all(kwargs.get(campo)) for campo in self.CAMPOS_OBRIGATORIOS:
            raise Exception

        self.header = Registro('header_arquivo', kwargs['versao'])
        self.trailer = Registro('trailer_arquivo', kwargs['versao'])

        # HEADER

        # 01.0
        self.header.controle_banco = kwargs['cedente_banco_codigo']

        # 05.0
        # CPF
        if len(kwargs['cedente_numero_documento']) == 11:
            self.header.empresa_inscricao_tipo = 1
        # CNPJ
        elif len(kwargs['cedente_numero_documento']) == 14:
            self.header.empresa_inscricao_tipo = 2
        # Documento inválido
        else:
            raise Exception
        # 06.0 
        self.header.empresa_inscricao_numero = kwargs['cedente_numero_documento']
        # 07.0
        self.header.empresa_convenio = kwargs['cedente_convenio']
        # 08.0
        self.header.empresa_conta_agencia_codigo = kwargs['cedente_agencia']
        # 09.0
        self.header.empresa_conta_agencia_dv = kwargs['cedente_agencia_dv']
        # 10.0
        self.header.empresa_conta_numero = kwargs['cedente_conta']
        # 11.0
        self.header.empresa_conta_dv = kwargs['cedente_conta_dv']
        # 12.0
        self.header.empresa_agencia_conta_dv = kwargs['cedente_agencia_conta_dv']
        # 13.0
        self.header.empresa_nome = kwargs['cedente_nome']
        # 14.0
        self.header.nome_do_banco = kwargs['cedente_banco_nome']

        # 16.0
        # 1 -> Remessa; 2 -> Retorno
        self.header.arquivo_codigo = 1

        now = datetime.now()
        # 17.0
        self.header.arquivo_data_de_geracao = now.strftime("%d%m%y")
        # 18.0
        self.header.arquivo_hora_de_geracao = now.strftime("%H%M%S")
        # 19.0
        self.header.arquivo_sequencia = kwargs['arquivo_sequencia']
        # 21.0
        self.header.arquivo_densidade = kwargs['arquivo_densidade']

        # TRAILER
        # 01.9
        self.trailer.controle_banco = kwargs['cedente_banco_codigo']
        # 05.9
        self.trailer.totais_quantidade_lotes = 0
        # 06.9
        self.trailer.totais_quantidade_registros = 0
        # 07.9
        self.lotes = []


    def __unicode__(self):
        if self.lotes.count() == 0:
            raise Exception

        unicode(self.header):
        unicode(lote) for lote in lotes
        unicode(self.trailer)

    def adicionar_lote(self, lote):
        if not isinstance(lote, 'Lote'):
            raise Exception
        self.lotes.append(lote)

        # Incrementar numero de lotes no trailer do arquivo
        self.trailer.totais_quantidade_lotes += 1

        # Incrementar numero de registros no trailer do arquivo
        for evento in lote.eventos:
            self.trailer.totais_quantidade_registros += evento.segmentos.count()


class Lote(object):
    HEADER_LOTE = None
    TRAILER_LOTE = None
    EVENTOS_VALIDOS = None
     
    def __init__(self, **kwargs):
        required_constants = (self.HEADER_LOTE, 
                              self.TRAILER_LOTE,
                              self.EVENTOS_VALIDOS)
        if not all(required_constants):
            raise NotImplementedError

        self.header = Registro(self.HEADER_LOTE, versao)
        self.trailer = Registro(self.TRAILER_LOTE, versao)
<commit_msg>Cnab240 -> Adicionando metodo escrever<commit_after>from cnab240.registro import Registro
from datetime import datetime

class Cnab240(object):

    CAMPOS_OBRIGATORIOS = (
        'versao',
        'banco_codigo',
        'banco_nome',
        'cedente_nome',
        'cedente_convenio',
        'cedente_agencia',
        'cedente_agencia_dv',
        'cedente_conta',
        'cedente_conta_dv',
        'cedente_agencia_conta_dv',
        'arquivo_sequencia',
        'arquivo_densidade'
    )

    def __init__(self, **kwargs):
        """
        Argumentos:
        - versao -> Versão do versao_layout
        - cedente_banco_codigo -> Código do banco
        - cedente_banco_nome -> Nome do banco
        - cedente_nome -> Nome do Cedente
        - cedente_numero_documento -> CPF/CNPJ
        - cedente_convenio -> Convênio com o banco
        - cedente_agencia -> Agência bancária
        - cedente_agencia_dv -> Digito verificador da agência
        - cedente_conta -> Conta corrente
        - cedente_conta_dv -> Digito verificador da conta
        - cedente_agencia_conta_dv -> Digito verificador da conta e agência
        - arquivo_sequencia -> Número sequencial do arquivo
        - arquivo_densidade -> Densidade de gravação do arquivo
        """

        if not all(kwargs.get(campo)) for campo in self.CAMPOS_OBRIGATORIOS:
            raise Exception

        self.header = Registro('header_arquivo', kwargs['versao'])
        self.trailer = Registro('trailer_arquivo', kwargs['versao'])

        # HEADER

        # 01.0
        self.header.controle_banco = kwargs['cedente_banco_codigo']

        # 05.0
        # CPF
        if len(kwargs['cedente_numero_documento']) == 11:
            self.header.empresa_inscricao_tipo = 1
        # CNPJ
        elif len(kwargs['cedente_numero_documento']) == 14:
            self.header.empresa_inscricao_tipo = 2
        # Documento inválido
        else:
            raise Exception
        # 06.0 
        self.header.empresa_inscricao_numero = kwargs['cedente_numero_documento']
        # 07.0
        self.header.empresa_convenio = kwargs['cedente_convenio']
        # 08.0
        self.header.empresa_conta_agencia_codigo = kwargs['cedente_agencia']
        # 09.0
        self.header.empresa_conta_agencia_dv = kwargs['cedente_agencia_dv']
        # 10.0
        self.header.empresa_conta_numero = kwargs['cedente_conta']
        # 11.0
        self.header.empresa_conta_dv = kwargs['cedente_conta_dv']
        # 12.0
        self.header.empresa_agencia_conta_dv = kwargs['cedente_agencia_conta_dv']
        # 13.0
        self.header.empresa_nome = kwargs['cedente_nome']
        # 14.0
        self.header.nome_do_banco = kwargs['cedente_banco_nome']

        # 16.0
        # 1 -> Remessa; 2 -> Retorno
        self.header.arquivo_codigo = 1

        now = datetime.now()
        # 17.0
        self.header.arquivo_data_de_geracao = now.strftime("%d%m%y")
        # 18.0
        self.header.arquivo_hora_de_geracao = now.strftime("%H%M%S")
        # 19.0
        self.header.arquivo_sequencia = kwargs['arquivo_sequencia']
        # 21.0
        self.header.arquivo_densidade = kwargs['arquivo_densidade']

        # TRAILER
        # 01.9
        self.trailer.controle_banco = kwargs['cedente_banco_codigo']
        # 05.9
        self.trailer.totais_quantidade_lotes = 0
        # 06.9
        self.trailer.totais_quantidade_registros = 0
        # 07.9
        self.lotes = []


    def __unicode__(self):
        if self.lotes.count() == 0:
            raise Exception

        unicode(self.header):
        unicode(lote) for lote in self.lotes
        unicode(self.trailer)

    def adicionar_lote(self, lote):
        if not isinstance(lote, 'Lote'):
            raise Exception
        self.lotes.append(lote)

        # Incrementar numero de lotes no trailer do arquivo
        self.trailer.totais_quantidade_lotes += 1

        # Incrementar numero de registros no trailer do arquivo
        for evento in lote.eventos:
            self.trailer.totais_quantidade_registros += evento.segmentos.count()

    def escrever(self, f):
        f.write(unicode(self.header)+"\n")
        f.write(unicode(lote)+"\n") for lote in self.lotes
        f.write(unicode(self.trailer)+"\n")


class Lote(object):
    HEADER_LOTE = None
    TRAILER_LOTE = None
    EVENTOS_VALIDOS = None
     
    def __init__(self, **kwargs):
        required_constants = (self.HEADER_LOTE, 
                              self.TRAILER_LOTE,
                              self.EVENTOS_VALIDOS)
        if not all(required_constants):
            raise NotImplementedError

        self.header = Registro(self.HEADER_LOTE, versao)
        self.trailer = Registro(self.TRAILER_LOTE, versao)

{'fraction_non_alphanumeric': 0.09397928355632283, 'fraction_numerical': 0.017371601208459216, 'mean_word_length': 2.153793807417489, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 34, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6735417', 'n_tokens_mistral': 3305, 'n_tokens_neox': 3182, 'n_words': 523}