<?php

namespace Cnab\Tests\Remessa\Cnab240;

class BancoDoBrasilTest extends \PHPUnit_Framework_TestCase
{
    public function testArquivoBancoDoBrasil240PodeSerCriado()
    {
        $this->markTestIncomplete('A versão do layout foi alterada de 020 para 030, porém não ainda está em beta e não foram feitos testes para a nova versão');

        $codigoBanco = \Cnab\Banco::BANCO_DO_BRASIL;
        $cnabFactory = new \Cnab\Factory();
        $arquivo = $cnabFactory->createRemessa($codigoBanco, 'cnab240');
        $arquivo->configure(array(
            'data_geracao' => new \DateTime('2015-02-01 01:02:03'),
            'data_gravacao' => new \DateTime('2015-02-01'),
            'nome_fantasia' => 'Nome Fantasia da sua empresa',
            'razao_social' => 'Razão social da sua empresa',
            'cnpj' => '11222333444455',
            'banco' => $codigoBanco, //código do banco
            'logradouro' => 'Logradouro da Sua empresa',
            'numero' => 'Número do endereço',
            'bairro' => 'Bairro da sua empresa',
            'cidade' => 'Cidade da sua empresa',
            'uf' => 'SP',
            'cep' => '00000111',
            'conta' => '123456',
            'conta_dv' => '5',
            'operacao' => '012',
            'agencia' => '1234',
            'agencia_dv' => '3',
            'codigo_convenio' => '123123',
            'codigo_carteira' => '11', // número da carteira
            'variacao_carteira' => '345',
            'numero_sequencial_arquivo' => 1,
        ));

        // você pode adicionar vários boletos em uma remessa
        $arquivo->insertDetalhe(array(
            'codigo_ocorrencia' => 1, // 1 = Entrada de título, futuramente poderemos ter uma constante
            'nosso_numero' => '12345',
            'numero_documento' => '12345678',
            'carteira' => '11',
            'codigo_carteira' => \Cnab\CodigoCarteira::COBRANCA_SIMPLES,
            'especie' => \Cnab\Especie::BB_DUPLICATA_MERCANTIL, // Você pode consultar as especies Cnab\Especie::CEF_OUTROS, futuramente poderemos ter uma tabela na documentação
            'aceite' => 'N', // "S" ou "N"
            'registrado' => false,
            'valor' => 100.39, // Valor do boleto
            'instrucao1' => '', // 1 = Protestar com (Prazo) dias, 2 = Devolver após (Prazo) dias, futuramente poderemos ter uma constante
            'instrucao2' => '', // preenchido com zeros
            'sacado_razao_social' => 'Nome do cliente', // O Sacado é o cliente, preste atenção nos campos abaixo
            'sacado_tipo' => 'cnpj', //campo fixo, escreva 'cpf' (sim as letras cpf) se for pessoa fisica, cnpj se for pessoa juridica
            'sacado_cnpj' => '21.222.333.4444-55',
            'sacado_logradouro' => 'Logradouro do cliente',
            'sacado_bairro' => 'Bairro do cliente',
            'sacado_cep' => '00000-111',
            'sacado_cidade' => 'Cidade do cliente',
            'sacado_uf' => 'BA',
            'data_vencimento' => new \DateTime('2015-02-03'),
            'data_cadastro' => new \DateTime('2015-01-14'),
            'codigo_juros_mora' => 2, //‘1’ = Valor por Dia, ‘2’ = Taxa Mensal, ‘3’ = Isento
            'juros_de_um_dia' => 0.10, // Valor de 1 dia ou taxa do juros de 1 mês
            'data_desconto' => new \DateTime('2015-02-09'),
            'valor_desconto' => 10.0, // Valor do desconto
            'prazo' => 10, // prazo de dias para o cliente pagar após o vencimento
            'taxa_de_permanencia' => '0', //00 = Acata Comissão por Dia (recomendável), 51 Acata Condições de Cadastramento na CAIXA
            'mensagem' => 'Descrição do boleto',
            'data_multa' => new \DateTime('2015-02-07'), // data da multa
            'valor_multa' => 11.2, // valor da multa
            'baixar_apos_dias' => 30,
            'dias_iniciar_contagem_juros' => 1,
        ));

        $texto = $arquivo->getText();
        $lines = explode("\r\n", trim($texto, "\r\n"));

        $this->assertEquals(7, count($lines));

        $headerArquivoText = $lines[0];
        $headerLoteText = $lines[1];
        $segmentoPText = $lines[2];
        $segmentoQText = $lines[3];
        $segmentoRText = $lines[4];
        $trailerLoteText = $lines[5];
        $trailerArquivoText = $lines[6];

        $asserts = array(
            'headerArquivo' => array(
                '1:3' => '001', // codigo_banco 
                '4:7' => '0000', // lote_servico 
                '8:8' => '0', // tipo_registro 
                '9:17' => '         ', // uso_exclusivo_febraban_01 
                '18:18' => '2', // codigo_inscricao 
                '19:32' => '11222333444455', // numero_inscricao 
                '33:41' => '000123123', // codigo convenio
                '42:45' => '0014', // Cobrança Cedende BB: Informar 0014 para cobrança cedente
                '46:47' => '11', // Carteira
                '48:50' => '345', // Variação carteira
                '51:52' => '  ', // uso reservado bb
                '53:57' => '01234', // agencia 
                '58:58' => '3', // agencia_dv 
                '59:70' => '000000123456', // conta
                '71:71' => '5', // conta dv
                '72:72' => ' ', // campo não tratado pelo bb
                '73:102' => 'Nome Fantasia da sua empresa  ', // nome_empresa 
                '103:132' => 'BANCO DO BRASIL S.A.          ', // nome_banco 
                '133:142' => '          ', // uso_exclusivo_febraban_02 
                '143:143' => '1', // codigo_remessa_retorno 
                '144:151' => '01022015', // data_geracao 
                '152:157' => '010203', // hora_geracao 
                '158:163' => '000001', // numero_sequencial_arquivo 
                '164:166' => '030', // versao_layout_arquivo 
                '167:171' => '00000', // densidade_gravacao_arquivo 
                '172:191' => '                    ', // Para Uso Reservado do Banco 
                '192:211' => 'REMESSA-PRODUCAO    ',  // Para Uso Reservado da Empresa
                '212:225' => '              ', // Uso Exclusivo FEBRABAN / CNAB
                '226:240' => '0000000000000000', // Uso Exclusivo FEBRABAN / CNAB
            ),
            'headerLote' => array(
                '1:3' => '001', // codigo_banco 
                '4:7' => '0001', // lote_servico 
                '8:8' => '1', // tipo_registro 
                '9:9' => 'R', // tipo_operacao 
                '10:11' => '01', // tipo_servico 
                '12:13' => '00', // Uso Exclusivo FEBRABAN/CNAB
                '14:16' => '030', // versao_layout_lote 
                '17:17' => ' ', // uso_exclusivo_febraban_01 
                '18:18' => '2', // codigo_inscricao 
                '19:33' => '011222333444455', // numero_inscricao 
                '34:42' => '000123123', // codigo_convenio 
                '43:46' => '0014', // Cobrança cedente, Informar 0014 para cobrança
                '47:48' => '11', // carteira
                '49:51' => '345', // variaçã carteira
                '52:53' => '  ', // Use TS para testes
                '54:58' => '01234', // agencia 
                '59:59' => '3', // agencia_dv 
                '60:71' => '000000123456', // conta
                '72:72' => '5', // conta dv
                '73:73' => ' ', // uso_exclusivo_banco_02 
                '74:103' => 'Nome Fantasia da sua empresa  ', // nome_empresa 
                '104:143' => '                                        ', // mensagem_1 
                '144:183' => '                                        ', // mensagem_2 
                '184:191' => '00000001', // numero_sequencial_arquivo 
                '192:199' => '01022015', // data_geracao 
                '200:207' => '00000000', // data_credito 
                '208:240' => '                                 ', // uso_exclusivo_febraban_02 
            ),
            'segmentoP' => array(
                '1:3' => '001', // codigo_banco 
                '4:7' => '0001', // lote_servico 
                '8:8' => '3', // tipo_registro 
                '9:13' => '00001', // numero_sequencial_lote 
                '14:14' => 'P', // codigo_segmento 
                '15:15' => ' ', // uso_exclusivo_febraban_01 
                '16:17' => '01', // codigo_ocorrencia 
                '18:22' => '01234', // agencia 
                '23:23' => '3', // agencia_dv 
                '24:35' => '000000123456', // número da conta
                '36:36' => '5', // conta dv
                '37:37' => ' ', // Dígito Verificador da Ag/Conta (Não usado pelo BB)
                '38:57' => '123123123459        ', // nosso_numero 
                '58:58' => '1', // codigo_carteira 
                '59:59' => '2', // forma_cadastramento 
                '60:60' => '2', // tipo_documento 
                '61:61' => '2', // identificacao_emissao 
                '62:62' => '2', // identificacao_distribuicao 
                '63:77' => '12345678       ', // numero_documento 
                '78:85' => '03022015', // vencimento 
                '86:100' => '000000000010039', // valor_titulo 
                '101:105' => '00000', // agencia_cobradora 
                '106:106' => '0', // agencia_cobradora_dv 
                '107:108' => '02', // especie 
                '109:109' => 'N', // aceite 
                '110:117' => '14012015', // data_emissao 
                '118:118' => '1', // codigo_juros_mora 
                '119:126' => '04022015', // data_juros_mora
                '127:141' => '000000000000010', // valor_juros_mora 
                '142:142' => '1', // codigo_desconto_1 
                '143:150' => '09022015', // data_desconto_1 
                '151:165' => '000000000001000', // valor_desconto_1 
                '166:180' => '000000000000000', // valor_iof 
                '181:195' => '000000000000000', // valor_abatimento 
                '196:220' => '12345678                 ', // uso_empresa 
                '221:221' => '3', // codigo_protesto 
                '222:223' => '00', // prazo_protesto 
                '224:224' => '0', // codigo_baixa 
                '225:227' => '000', // prazo_baixa 
                '228:229' => '09', // codigo_moeda 
                '230:239' => '0000000000', // uso_exclusivo_banco_03 
                '240:240' => ' ', // uso_exclusivo_febraban_02 
            ),
            'segmentoQ' => array(
                '1:3' => '001', // codigo_banco 
                '4:7' => '0001', // lote_servico 
                '8:8' => '3', // tipo_registro 
                '9:13' => '00002', // numero_sequencial_lote 
                '14:14' => 'Q', // codigo_segmento 
                '15:15' => ' ', // uso_exclusivo_febraban_01 
                '16:17' => '01', // codigo_ocorrencia 
                '18:18' => '2', // sacado_codigo_inscricao 
                '19:33' => '021222333444455', // sacado_numero_inscricao 
                '34:73' => 'NOME DO CLIENTE                         ', // nome 
                '74:113' => 'LOGRADOURO DO CLIENTE                   ', // logradouro 
                '114:128' => 'BAIRRO DO CLIEN', // bairro 
                '129:136' => '00000111', // cep 
                '137:151' => 'CIDADE DO CLIEN', // cidade 
                '152:153' => 'BA', // estado 
                '154:154' => '2', // sacador_codigo_inscricao 
                '155:169' => '011222333444455', // sacador_numero_inscricao 
                '170:209' => 'Nome Fantasia da sua empresa            ', // sacador_nome 
                '210:212' => '   ', // uso_exclusivo_febraban_02 
                '213:232' => '                    ', // uso_exclusivo_febraban_03 
                '233:240' => '        ', // uso_exclusivo_febraban_04 
            ),
            'segmentoR' => array(
                '1:3' => '001', // codigo_banco 
                '4:7' => '0001', // lote_servico 
                '8:8' => '3', // tipo_registro 
                '9:13' => '00003', // numero_sequencial_lote 
                '14:14' => 'R', // codigo_segmento 
                '15:15' => ' ', // uso_exclusivo_febraban_01 
                '16:17' => '01', // codigo_ocorrencia 

                // campos não tratado pelo banco do brasil
                '18:65' => '                                                ', // uso_exclusivo_febraban_02 

                '66:66' => '1', // codigo_multa 
                '67:74' => '07022015', // data_multa 
                '75:89' => '000000000001120', // valor_multa 
                '90:99' => '          ', // informacao_sacado 
                '100:139' => '                                        ', // mensagem_3 
                '140:179' => '                                        ', // mensagem_4 
                '180:240' => '                                                             ', // uso_exclusivo_febraban_03 
            ),
            'trailerLote' => array(
                '1:3' => '001', // codigo_banco 
                '4:7' => '0001', // lote_servico 
                '8:8' => '5', // tipo_registro 
                '18:23' => '000005', // qtde_registro_lote 
                '24:240' => str_repeat(' ', 217), // uso_exclusivo_febraban_02
            ),
            'trailerArquivo' => array(
                '1:3' => '001', // codigo_banco 
                '4:7' => '9999', // lote_servico 
                '8:8' => '9', // tipo_registro 
                '9:17' => '         ', // uso_exclusivo_febraban01 
                '18:23' => '000001', // qtde_lotes 
                '24:29' => '000007', // qtde_registros 
                '30:35' => '      ', // uso_exclusivo_febraban02 
                '36:240' => '                                                                                                                                                                                                             ', // uso_exclusivo_febraban_03 
            ),
        );

        foreach ($asserts as $tipo => $campos) {
            $vname = "{$tipo}Text";
            foreach ($campos as $pos => $value) {
                $aux = explode(':', $pos);
                $start = $aux[0] - 1;
                $end = ($aux[1] - $aux[0]) + 1;
                $this->assertEquals($value, substr($$vname, $start, $end), "[ ] Campo $pos do $tipo");
            }
        }
    }
}
