diff --git a/src/Builder/BradescoCnab400Builder.php b/src/Builder/BradescoCnab400Builder.php index 176f433..1745132 100755 --- a/src/Builder/BradescoCnab400Builder.php +++ b/src/Builder/BradescoCnab400Builder.php @@ -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 { @@ -38,8 +39,7 @@ public function build() return $this ->transacao() ->header() - ->trailler() - ; + ->trailler(); } /** @@ -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), @@ -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; } @@ -136,13 +131,13 @@ 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')); @@ -150,6 +145,7 @@ protected function header() $header->setSequencialRemessa($this->detalhesBoleto['totalRemessas']); $this->header = $header; + return $this; } @@ -162,6 +158,7 @@ protected function trailler() $trailler = new Trailler(); $trailler->setSequencialRegistro(1); $this->trailler = $trailler; + return $this; } @@ -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(); diff --git a/src/Cnab/Cnab400/Bradesco/Transacao.php b/src/Cnab/Cnab400/Bradesco/Transacao.php index 4c9e9e0..d412fad 100755 --- a/src/Cnab/Cnab400/Bradesco/Transacao.php +++ b/src/Cnab/Cnab400/Bradesco/Transacao.php @@ -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 + ); } /** @@ -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 + ); } /** @@ -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() @@ -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( diff --git a/src/Modulo/Modulo11.php b/src/Modulo/Modulo11.php new file mode 100644 index 0000000..574aa3c --- /dev/null +++ b/src/Modulo/Modulo11.php @@ -0,0 +1,73 @@ +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; + } + } +} \ No newline at end of file diff --git a/src/Modulo/ModuloInterface.php b/src/Modulo/ModuloInterface.php new file mode 100644 index 0000000..c97e45b --- /dev/null +++ b/src/Modulo/ModuloInterface.php @@ -0,0 +1,16 @@ +