<commit_before><?php
namespace Cnab\Remessa\Cnab240;

class Arquivo implements \Cnab\Remessa\IArquivo
{
    public  $headerArquivo;
    public  $headerLote;
    public  $detalhes = array();
    public  $trailerLote;
    public  $trailerArquivo;
    
    private $_data_gravacao;
    private $_data_geracao;
    public  $banco;
    public  $codigo_banco; 
    public  $configuracao = array();
    public  $layoutVersao;
    const   QUEBRA_LINHA = "\r\n";

    public function __construct($codigo_banco, $layoutVersao=null)
    {
        $this->codigo_banco = $codigo_banco;
        $this->layoutVersao = $layoutVersao;
        $this->banco = \Cnab\Banco::getBanco($this->codigo_banco);
        //$this->data_gravacao = date('dmY');
    }

    public function configure(array $params)
    {
        $banco = \Cnab\Banco::getBanco($this->codigo_banco);
        $campos = array(
            'data_geracao', 'data_gravacao', 'nome_fantasia', 'razao_social', 'cnpj', 'logradouro', 'numero', 'bairro', 
            'cidade', 'uf', 'cep',
        );

        if($this->codigo_banco == \Cnab\Banco::CEF)
        {
            $campos[] = 'agencia';
            $campos[] = 'agencia_dv';
            $campos[] = 'codigo_cedente';
            $campos[] = 'numero_sequencial_arquivo';
        }

        foreach($campos as $campo)
        {
            if(array_key_exists($campo, $params))
            {
                if(strpos($campo, 'data_') === 0 && !($params[$campo] instanceof \DateTime))
                    throw new \Exception("config '$campo' need to be instance of DateTime");
                $this->configuracao[$campo] = $params[$campo];
            }
            else
                throw new \Exception('Configuração "'.$campo.'" need to be set');
        }
            
        foreach($campos as $key)
        {
            if(!array_key_exists($key, $params))
                throw new Exception('Configuração "'.$key.'" dont exists');
        }

        $this->data_geracao  = $this->configuracao['data_geracao'];
        $this->data_gravacao = $this->configuracao['data_gravacao'];

        $this->headerArquivo = new HeaderArquivo($this);
        $this->headerLote = new HeaderLote($this);
        $this->trailerLote = new TrailerLote($this);
        $this->trailerArquivo = new TrailerArquivo($this);

        $this->headerArquivo->codigo_banco = $this->banco['codigo_do_banco'];
        $this->headerArquivo->codigo_inscricao = 2;
        $this->headerArquivo->numero_inscricao = $this->prepareText($this->configuracao['cnpj'], '.-/');
        $this->headerArquivo->agencia = $this->configuracao['agencia'];
        $this->headerArquivo->agencia_dv = $this->configuracao['agencia_dv'];
        $this->headerArquivo->codigo_cedente = $this->configuracao['codigo_cedente'];
        $this->headerArquivo->nome_empresa = $this->configuracao['nome_fantasia'];
        $this->headerArquivo->nome_banco = $banco['nome_do_banco'];
        $this->headerArquivo->codigo_remessa_retorno = 1;
        $this->headerArquivo->data_geracao = $this->configuracao['data_geracao'];
        $this->headerArquivo->hora_geracao = $this->configuracao['data_geracao'];
        $this->headerArquivo->numero_sequencial_arquivo = $this->configuracao['numero_sequencial_arquivo'];

        $this->headerLote->codigo_banco = $this->headerArquivo->codigo_banco;
        $this->headerLote->lote_servico = 1;
        $this->headerLote->tipo_operacao = 'R';
        $this->headerLote->codigo_inscricao = $this->headerArquivo->codigo_inscricao;
        $this->headerLote->numero_inscricao = $this->headerArquivo->numero_inscricao;
        $this->headerLote->agencia = $this->headerArquivo->agencia;
        $this->headerLote->agencia_dv = $this->headerArquivo->agencia_dv;
        $this->headerLote->codigo_convenio = $this->headerArquivo->codigo_cedente;
        $this->headerLote->codigo_cedente = $this->headerArquivo->codigo_cedente;
        $this->headerLote->nome_empresa = $this->headerArquivo->nome_empresa;
        $this->headerLote->numero_sequencial_arquivo = $this->headerArquivo->numero_sequencial_arquivo;
        $this->headerLote->data_geracao = $this->headerArquivo->data_geracao;
        if($this->codigo_banco = \Cnab\Banco::CEF)
            $this->headerLote->tipo_servico = 2;

        $this->trailerLote->codigo_banco = $this->headerArquivo->codigo_banco;
        $this->trailerLote->lote_servico = $this->headerLote->lote_servico;

        $this->trailerArquivo->codigo_banco = $this->headerArquivo->codigo_banco;
    }
       
    public function insertDetalhe(array $boleto, $tipo='remessa')
    {
        $dateVencimento = $boleto['data_vencimento'] instanceof \DateTime ? $boleto['data_vencimento'] : new \DateTime($boleto['data_vencimento']);
        $dateCadastro = $boleto['data_cadastro'] instanceof \DateTime ? $boleto['data_cadastro'] : new \DateTime($boleto['data_cadastro']);

        $detalhe = new Detalhe($this);

        // SEGMENTO P -------------------------------
        $detalhe->segmento_p->codigo_banco = $this->headerArquivo->codigo_banco;
        $detalhe->segmento_p->lote_servico = $this->headerLote->lote_servico;
        $detalhe->segmento_p->agencia = $this->headerArquivo->agencia;
        $detalhe->segmento_p->agencia_dv = $this->headerArquivo->agencia_dv;
        $detalhe->segmento_p->codigo_cedente = $this->headerArquivo->codigo_cedente;
        $detalhe->segmento_p->nosso_numero = $boleto['nosso_numero'];
        $detalhe->segmento_p->codigo_carteira = 1; // 1 = Cobrança Simples
        if ($this->layoutVersao === 'sigcb' && $this->codigo_banco = \Cnab\Banco::CEF) {
            $detalhe->segmento_p->modalidade_carteira = $boleto['modalidade_carteira']; // 21 = (título Sem Registro emissão CAIXA)
        }
        $detalhe->segmento_p->forma_cadastramento = $boleto['registrado'] ? 1 : 2; // 1 = Com, 2 = Sem Registro
        if($boleto['registrado'] && $this->codigo_banco = \Cnab\Banco::CEF)
            $this->headerLote->tipo_servico = 1;
        $detalhe->segmento_p->numero_documento = $boleto['numero_documento'];
        $detalhe->segmento_p->vencimento = $dateVencimento;
        $detalhe->segmento_p->valor_titulo = $boleto['valor'];
        $detalhe->segmento_p->especie = $boleto['especie']; // 4 = Duplicata serviço
        $detalhe->segmento_p->aceite = $boleto['aceite'];
        $detalhe->segmento_p->data_emissao = $dateCadastro;
        $detalhe->segmento_p->codigo_juros_mora = 1; // 1 = Por dia
        $detalhe->segmento_p->data_juros_mora = $dateVencimento;
        $detalhe->segmento_p->valor_juros_mora = $boleto['juros_de_um_dia'];
        if($boleto['valor_desconto'] > 0) {
            $detalhe->segmento_p->codigo_desconto_1 = 1; // valor fixo
            $detalhe->segmento_p->data_desconto_1 = $boleto['data_desconto'];
            $detalhe->segmento_p->valor_desconto_1 = $boleto['valor_desconto'];
        } else {
            $detalhe->segmento_p->codigo_desconto_1 = 0; // sem desconto
            $detalhe->segmento_p->data_desconto_1 = 0;
            $detalhe->segmento_p->valor_desconto_1 = 9;
        }
        $detalhe->segmento_p->valor_abatimento = 0;
        $detalhe->segmento_p->uso_empresa = $boleto['numero_documento'];
        $detalhe->segmento_p->codigo_protesto = 3; // 3 = Não protestar
        $detalhe->segmento_p->prazo_protesto = 0;
        $detalhe->segmento_p->codigo_baixa = 1; // Baixar
        $detalhe->segmento_p->prazo_baixa = 30; // Baixar automaticamente após 30 dias

        if($tipo == 'remessa') {
            $detalhe->segmento_p->codigo_ocorrencia = 1;
        } else if($tipo == 'baixa') {
            $detalhe->segmento_p->codigo_ocorrencia = 2;<commit_msg>inserindo a Identificação de Distribuição, necessária para o Segmento P (CEF Somente)<commit_after><?php
namespace Cnab\Remessa\Cnab240;

class Arquivo implements \Cnab\Remessa\IArquivo
{
    public  $headerArquivo;
    public  $headerLote;
    public  $detalhes = array();
    public  $trailerLote;
    public  $trailerArquivo;
    
    private $_data_gravacao;
    private $_data_geracao;
    public  $banco;
    public  $codigo_banco; 
    public  $configuracao = array();
    public  $layoutVersao;
    const   QUEBRA_LINHA = "\r\n";

    public function __construct($codigo_banco, $layoutVersao=null)
    {
        $this->codigo_banco = $codigo_banco;
        $this->layoutVersao = $layoutVersao;
        $this->banco = \Cnab\Banco::getBanco($this->codigo_banco);
        //$this->data_gravacao = date('dmY');
    }

    public function configure(array $params)
    {
        $banco = \Cnab\Banco::getBanco($this->codigo_banco);
        $campos = array(
            'data_geracao', 'data_gravacao', 'nome_fantasia', 'razao_social', 'cnpj', 'logradouro', 'numero', 'bairro', 
            'cidade', 'uf', 'cep',
        );

        if($this->codigo_banco == \Cnab\Banco::CEF)
        {
            $campos[] = 'agencia';
            $campos[] = 'agencia_dv';
            $campos[] = 'codigo_cedente';
            $campos[] = 'numero_sequencial_arquivo';
        }

        foreach($campos as $campo)
        {
            if(array_key_exists($campo, $params))
            {
                if(strpos($campo, 'data_') === 0 && !($params[$campo] instanceof \DateTime))
                    throw new \Exception("config '$campo' need to be instance of DateTime");
                $this->configuracao[$campo] = $params[$campo];
            }
            else
                throw new \Exception('Configuração "'.$campo.'" need to be set');
        }
            
        foreach($campos as $key)
        {
            if(!array_key_exists($key, $params))
                throw new Exception('Configuração "'.$key.'" dont exists');
        }

        $this->data_geracao  = $this->configuracao['data_geracao'];
        $this->data_gravacao = $this->configuracao['data_gravacao'];

        $this->headerArquivo = new HeaderArquivo($this);
        $this->headerLote = new HeaderLote($this);
        $this->trailerLote = new TrailerLote($this);
        $this->trailerArquivo = new TrailerArquivo($this);

        $this->headerArquivo->codigo_banco = $this->banco['codigo_do_banco'];
        $this->headerArquivo->codigo_inscricao = 2;
        $this->headerArquivo->numero_inscricao = $this->prepareText($this->configuracao['cnpj'], '.-/');
        $this->headerArquivo->agencia = $this->configuracao['agencia'];
        $this->headerArquivo->agencia_dv = $this->configuracao['agencia_dv'];
        $this->headerArquivo->codigo_cedente = $this->configuracao['codigo_cedente'];
        $this->headerArquivo->nome_empresa = $this->configuracao['nome_fantasia'];
        $this->headerArquivo->nome_banco = $banco['nome_do_banco'];
        $this->headerArquivo->codigo_remessa_retorno = 1;
        $this->headerArquivo->data_geracao = $this->configuracao['data_geracao'];
        $this->headerArquivo->hora_geracao = $this->configuracao['data_geracao'];
        $this->headerArquivo->numero_sequencial_arquivo = $this->configuracao['numero_sequencial_arquivo'];

        $this->headerLote->codigo_banco = $this->headerArquivo->codigo_banco;
        $this->headerLote->lote_servico = 1;
        $this->headerLote->tipo_operacao = 'R';
        $this->headerLote->codigo_inscricao = $this->headerArquivo->codigo_inscricao;
        $this->headerLote->numero_inscricao = $this->headerArquivo->numero_inscricao;
        $this->headerLote->agencia = $this->headerArquivo->agencia;
        $this->headerLote->agencia_dv = $this->headerArquivo->agencia_dv;
        $this->headerLote->codigo_convenio = $this->headerArquivo->codigo_cedente;
        $this->headerLote->codigo_cedente = $this->headerArquivo->codigo_cedente;
        $this->headerLote->nome_empresa = $this->headerArquivo->nome_empresa;
        $this->headerLote->numero_sequencial_arquivo = $this->headerArquivo->numero_sequencial_arquivo;
        $this->headerLote->data_geracao = $this->headerArquivo->data_geracao;
        if($this->codigo_banco = \Cnab\Banco::CEF)
            $this->headerLote->tipo_servico = 2;

        $this->trailerLote->codigo_banco = $this->headerArquivo->codigo_banco;
        $this->trailerLote->lote_servico = $this->headerLote->lote_servico;

        $this->trailerArquivo->codigo_banco = $this->headerArquivo->codigo_banco;
    }
       
    public function insertDetalhe(array $boleto, $tipo='remessa')
    {
        $dateVencimento = $boleto['data_vencimento'] instanceof \DateTime ? $boleto['data_vencimento'] : new \DateTime($boleto['data_vencimento']);
        $dateCadastro = $boleto['data_cadastro'] instanceof \DateTime ? $boleto['data_cadastro'] : new \DateTime($boleto['data_cadastro']);

        $detalhe = new Detalhe($this);

        // SEGMENTO P -------------------------------
        $detalhe->segmento_p->codigo_banco = $this->headerArquivo->codigo_banco;
        $detalhe->segmento_p->lote_servico = $this->headerLote->lote_servico;
        $detalhe->segmento_p->agencia = $this->headerArquivo->agencia;
        $detalhe->segmento_p->agencia_dv = $this->headerArquivo->agencia_dv;
        $detalhe->segmento_p->codigo_cedente = $this->headerArquivo->codigo_cedente;
        $detalhe->segmento_p->nosso_numero = $boleto['nosso_numero'];
        $detalhe->segmento_p->codigo_carteira = 1; // 1 = Cobrança Simples
        if ($this->layoutVersao === 'sigcb' && $this->codigo_banco = \Cnab\Banco::CEF) {
            $detalhe->segmento_p->modalidade_carteira = $boleto['modalidade_carteira']; // 21 = (título Sem Registro emissão CAIXA)
        }
        $detalhe->segmento_p->forma_cadastramento = $boleto['registrado'] ? 1 : 2; // 1 = Com, 2 = Sem Registro
        if($boleto['registrado'] && $this->codigo_banco = \Cnab\Banco::CEF)
            $this->headerLote->tipo_servico = 1;
        $detalhe->segmento_p->numero_documento = $boleto['numero_documento'];
        $detalhe->segmento_p->vencimento = $dateVencimento;
        $detalhe->segmento_p->valor_titulo = $boleto['valor'];
        $detalhe->segmento_p->especie = $boleto['especie']; // 4 = Duplicata serviço
        $detalhe->segmento_p->aceite = $boleto['aceite'];
        $detalhe->segmento_p->data_emissao = $dateCadastro;
        $detalhe->segmento_p->codigo_juros_mora = 1; // 1 = Por dia
        $detalhe->segmento_p->data_juros_mora = $dateVencimento;
        $detalhe->segmento_p->valor_juros_mora = $boleto['juros_de_um_dia'];
        if($boleto['valor_desconto'] > 0) {
            $detalhe->segmento_p->codigo_desconto_1 = 1; // valor fixo
            $detalhe->segmento_p->data_desconto_1 = $boleto['data_desconto'];
            $detalhe->segmento_p->valor_desconto_1 = $boleto['valor_desconto'];
        } else {
            $detalhe->segmento_p->codigo_desconto_1 = 0; // sem desconto
            $detalhe->segmento_p->data_desconto_1 = 0;
            $detalhe->segmento_p->valor_desconto_1 = 9;
        }
        $detalhe->segmento_p->valor_abatimento = 0;
        $detalhe->segmento_p->uso_empresa = $boleto['numero_documento'];
        $detalhe->segmento_p->codigo_protesto = 3; // 3 = Não protestar
        $detalhe->segmento_p->prazo_protesto = 0;
        $detalhe->segmento_p->codigo_baixa = 1; // Baixar
        $detalhe->segmento_p->prazo_baixa = 30; // Baixar automaticamente após 30 dias
        $detalhe->segmento_p->identificacao_distribuicao = $boleto['identificacao_distribuicao'];

        if($tipo == 'remessa') {
            $detalhe->segmento_p->codigo_ocorrencia = 1;
        } else if($tipo == 'baixa') {
            $detalhe->segmento_p->codigo_ocorrencia = 2;
{'fraction_non_alphanumeric': 0.1556543019062339, 'fraction_numerical': 0.005409582689335394, 'mean_word_length': 3.0261861550427795, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 383, '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': '6629428', 'n_tokens_mistral': 5757, 'n_tokens_neox': 5674, 'n_words': 678}