Skip to content

Commit

Permalink
Merge pull request #7 from viniciuseneas/master
Browse files Browse the repository at this point in the history
Correções para geração do arquivo remessa Bradesco CNAB400
  • Loading branch information
valterjrdev authored Aug 30, 2018
2 parents 3546c90 + 4631d4e commit 5a02017
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 52 deletions.
91 changes: 44 additions & 47 deletions src/Builder/BradescoCnab400Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\Bradesco\Header;
use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\Bradesco\File;
use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\Bradesco\Trailler;
use Umbrella\Ya\RemessaBoleto\Modulo\Modulo11;

class BradescoCnab400Builder extends Builder
{
Expand Down Expand Up @@ -38,8 +39,7 @@ public function build()
return $this
->transacao()
->header()
->trailler()
;
->trailler();
}

/**
Expand All @@ -48,15 +48,20 @@ public function build()
*/
protected function transacao()
{
$seqConvenio = $this->getSeqConvenio($this->detalhesBoleto['convenios']);
$convenioBancario = $this->detalhesBoleto['convenios'][$seqConvenio];
$documentosArrecadacao = $this->detalhesBoleto['transacoes'][$seqConvenio];
$seqConvenio = $this->getSeqConvenio($this->detalhesBoleto['convenios']);
$convenioBancario = $this->detalhesBoleto['convenios'][$seqConvenio];
$documentosArrecadacao = $this->detalhesBoleto['transacoes'][$seqConvenio];

$arrTransacoes = [];

foreach ($documentosArrecadacao['dam'] as $key => $documento) {
$transacao = new Transacao;

$transacao->setAgenciaDebito('0');
$transacao->setDigitoAgenciaDebito('0');
$transacao->setRazaoContaCorrente('0');
$transacao->setContaCorrente('0');
$transacao->setDigitoContaCorrente('0');
$transacao->setIdentificacaoEmpresaBeneficiaria(
$this->concatenarDados(
str_pad($convenioBancario['carteira']['nome'], 3, 0, STR_PAD_LEFT),
Expand All @@ -65,64 +70,54 @@ protected function transacao()
$convenioBancario['digitoConta']
)
);

$transacao->setIdentificacaoTituloBanco($this->parseInteger(substr($documento['nossoNumero'], 2, 12)));
$transacao->setDigitoAutoConferencia(
mb_substr(
$documento['nossoNumero'],
strlen(
$documento['nossoNumero']
) - 1
)
);

$transacao->setNumeroDocumento($documento['numeroDocumento']);
$transacao->setValorTitulo(str_replace(['.', ','], '', $documento['valor']));
$transacao->setNumeroInscricaoPagador($documento['pessoa']['cpfCnpj']);
$transacao->setNomePagador($documento['pessoa']['nome']);
$transacao->setEnderecoPagador($this->removerAcentos($documento['pessoa']['endereco']));
$transacao->setCep(substr($documento['pessoa']['cep'], 0, 5));
$transacao->setSufixoCep(substr($documento['pessoa']['cep'], 5, 3));
$transacao->setDataVencimentoTitulo(
(new \DateTime($documento['dataVencimento']))->format('dmy')
$transacao->setNumeroControleParticipante('0');
$transacao->setCodigoBancoDebitado(0);
$transacao->setMulta(0);
$transacao->setPercentualMulta(0);
$transacao->setIdentificacaoTituloBanco(
$this->parseInteger(substr($documento['nossoNumero'], 2, 12))
);
$transacao->setDataEmissaoTitulo(
(new \DateTime($documento['dataEmissao']))->format('dmy')
$digitoVerificador = (new Modulo11())->calcularDigitoVerificador(
$convenioBancario['carteira']['nome'] . $documento['nossoNumero']
);

$transacao->setDigitoAutoConferencia($digitoVerificador);
$transacao->setDescontoBonificacao('0');
$transacao->setCondicaoEmissao(2);
$transacao->setEmiteBoletoDebitoAutomatico('N');
$transacao->setOperacaoBanco(str_pad('', 10, ' '));
$transacao->setIndicadorRateioCredito(' ');
$transacao->setAvisoDebitoAutomatico(2);
$transacao->setIdentificacaoOcorrencia('01');
$transacao->setCodigoBancoDebitado(0);
$transacao->setNumeroDocumento($documento['numeroDocumento']);
$transacao->setDataVencimentoTitulo((new \DateTime($documento['dataVencimento']))->format('dmy'));
$transacao->setValorTitulo(str_replace(['.', ','], '', $documento['valor']));
$transacao->setEspecieTitulo('99');
$transacao->setDataEmissaoTitulo(
(new \DateTime($documento['dataEmissao']))->format('dmy')
);
$transacao->setPrimeiraInstrucao('00');
$transacao->setSegundaInstrucao('00');
$transacao->setTipoInscricaoPagador('01');
$transacao->setValorPorDiaATrasado('0');
$transacao->setDataLimiteDesconto(str_pad('', 6, '0'));
$transacao->setValorDesconto('0');
$transacao->setValorIof('0');
$transacao->setValorAbatimento('0');
$transacao->setSegundaMensagem(' ');
$transacao->setNumeroControleParticipante('0');
$transacao->setMulta(0);
$transacao->setPercentualMulta(0);
$transacao->setDescontoBonificacao('0');
$transacao->setIndicadorRateioCredito(' ');
$transacao->setAgenciaDebito('0');
$transacao->setDigitoAgenciaDebito('0');
$transacao->setRazaoContaCorrente('0');
$transacao->setContaCorrente('0');
$transacao->setDigitoContaCorrente('0');
$transacao->setAvisoDebitoAutomatico(2);
$transacao->setPrimeiraMensagem(' ');

$numeroInscricaoPagador = strlen($documento['pessoa']['cpfCnpj']) === 11 ? '01' : '02';
$transacao->setTipoInscricaoPagador($numeroInscricaoPagador);
$transacao->setNumeroInscricaoPagador($documento['pessoa']['cpfCnpj']);
$transacao->setNomePagador($this->removerAcentos($documento['pessoa']['nome']));
$transacao->setEnderecoPagador($this->removerAcentos($documento['pessoa']['endereco']));
$transacao->setPrimeiraMensagem(' ');
$transacao->setCep(substr($documento['pessoa']['cep'], 0, 5));
$transacao->setSufixoCep(substr($documento['pessoa']['cep'], 5, 3));
$transacao->setSegundaMensagem(' ');
$transacao->setSequencialRegistro(str_pad('1', 6, 0));

$arrTransacoes[] = $transacao;
}
$this->transacoes = $arrTransacoes;

return $this;
}

Expand All @@ -136,20 +131,21 @@ protected function header()

$header = new Header();
$header->setRazaoSocial(
mb_strtoupper(
$this->removerAcentos(mb_strtoupper(
mb_substr(
$this->detalhesBoleto['convenios'][$seqConvenio]['orgao']['descricao'],
0,
30
)
)
))
);
$header->setCodigoEmpresa($this->detalhesBoleto['convenios'][$seqConvenio]['convenio']);
$header->setDataGeracao((new \DateTime())->format('dmy'));
$header->setSequencialRegistro(1);
$header->setSequencialRemessa($this->detalhesBoleto['totalRemessas']);

$this->header = $header;

return $this;
}

Expand All @@ -162,6 +158,7 @@ protected function trailler()
$trailler = new Trailler();
$trailler->setSequencialRegistro(1);
$this->trailler = $trailler;

return $this;
}

Expand All @@ -176,9 +173,9 @@ public function montarArquivo(string $path)
throw new \Exception("Não foi possivel abrir o arquivo para criar a remessa {$fullpath}");
}

$header = $this->header;
$header = $this->header;
$transacoes = $this->transacoes;
$trailler = $this->trailler;
$trailler = $this->trailler;

$stringHeader = $header->getHeaderToString();

Expand Down
23 changes: 18 additions & 5 deletions src/Cnab/Cnab400/Bradesco/Transacao.php
Original file line number Diff line number Diff line change
Expand Up @@ -830,7 +830,12 @@ public function getNomePagador()
*/
public function setNomePagador($nomePagador)
{
$this->nomePagador = str_pad(mb_strtoupper($nomePagador), 40, ' ', STR_PAD_RIGHT);
$this->nomePagador = str_pad(
mb_strtoupper(mb_substr($nomePagador, 0, 40)),
40,
' ',
STR_PAD_RIGHT
);
}

/**
Expand All @@ -846,7 +851,12 @@ public function getEnderecoPagador()
*/
public function setEnderecoPagador($enderecoPagador)
{
$this->enderecoPagador = str_pad(mb_strtoupper($enderecoPagador), 40, ' ', STR_PAD_RIGHT);
$this->enderecoPagador = str_pad(
mb_strtoupper(mb_substr($enderecoPagador, 0, 40)),
40,
' ',
STR_PAD_RIGHT
);
}

/**
Expand Down Expand Up @@ -945,6 +955,10 @@ public function setSequencialRegistro($sequencialRegistro)
$this->sequencialRegistro = str_pad($sequencialRegistro, 6, 0, STR_PAD_LEFT);
}

/**
* @return string
* @throws \Exception
*/
public function getTransacaoToString()
{
$stringTransacao = $this->getIdentificacaoRegistro()
Expand Down Expand Up @@ -990,9 +1004,8 @@ public function getTransacaoToString()
. $this->getPrimeiraMensagem()
. $this->getCep()
. $this->getSufixoCep()
. ($this->getSacador() ? : $this->getSegundaMensagem())
. $this->getSequencialRegistro()
;
. ($this->getSacador() ?: $this->getSegundaMensagem())
. $this->getSequencialRegistro();

if (mb_strlen($stringTransacao) != 400) {
throw new \Exception(
Expand Down
73 changes: 73 additions & 0 deletions src/Modulo/Modulo11.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php

namespace Umbrella\Ya\RemessaBoleto\Modulo;

/**
* Class Modulo11
* @package Umbrella\Ya\RemessaBoleto\Modulo
*/
class Modulo11 implements ModuloInterface
{
/**
* @param string $numero
* @return int|mixed|string
*/
public function calcularDigitoVerificador(string $numero)
{
$modulo11 = $this->modulo11($numero, 7, 1);
$digito = 11 - $modulo11;

if ($digito == 10) {
$digitoVerificador = "P";
} elseif ($digito == 11) {
$digitoVerificador = 0;
} else {
$digitoVerificador = $digito;
}

return $digitoVerificador;
}

/**
* @param $num
* @param int $base
* @param int $resto
* @return int
*/
private function modulo11($num, $base = 9, $resto = 0)
{
$soma = 0;
$fator = 2;

/* Separacao dos numeros */
for ($i = strlen($num); $i > 0; $i--) {
// pega cada numero isoladamente
$numeros[$i] = substr($num, $i - 1, 1);
// Efetua multiplicacao do numero pelo falor
$parcial[$i] = $numeros[$i] * $fator;
// Soma dos digitos
$soma += $parcial[$i];
if ($fator == $base) {
// restaura fator de multiplicacao para 2
$fator = 1;
}
$fator++;
}

/* Calculo do modulo 11 */
if ($resto == 0) {
$soma *= 10;
$digito = $soma % 11;

if ($digito == 10) {
$digito = 0;
}

return $digito;
} elseif ($resto == 1) {
$resto = $soma % 11;

return $resto;
}
}
}
16 changes: 16 additions & 0 deletions src/Modulo/ModuloInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace Umbrella\Ya\RemessaBoleto\Modulo;

/**
* Interface ModuloInterface
* @package Umbrella\Ya\RemessaBoleto\Modulo
*/
interface ModuloInterface
{
/**
* @param string $numero
* @return mixed
*/
public function calcularDigitoVerificador(string $numero);
}

0 comments on commit 5a02017

Please sign in to comment.