Comments (28)
Olá amigos, boa tarde, venho informar que a remessa foi homologada e colocada em produção, por falta de tempo ainda não pude ajudar na implementação do registro S, mas irei ajudar.
Obrigado a todos, sempre!
from opencnabphp.
Boa tarde @insidewill , já atualizei a readme da biblioteca com a homologação do santander cnab240
from opencnabphp.
Obrigado a todos vocês pela disposição e ajuda!
from opencnabphp.
Alguém pode me dar um ajuda ? Já tentei corrigir essas ocorrências e o banco está recusando o arquivo de remessa do Santander. Já foi recusado 3 vezes e cada vez retorna com ocorrências diferentes
from opencnabphp.
Posta seu arquivo aqui para vermos
from opencnabphp.
Olá @Guilherme00 realizamos um ajuste no arquivo Registro3P para que o dígito do nosso número seja calculado automaticamente e com isso alguns dos erros que você mencionou deverão ser corrigidos.
Os demais sobre multas e juros são parâmetros que você está informando de forma equivocada.
Para auxiliar melhor peço que você informe se:
1 - Irá cobrar multas?
1.1 - Se sim, a partir de quando?
1.2 - Irá cobrar valor fixo de multa ou percentual e qual o seu respectivo valor
21 - Irá cobrar juros?
2.1 - Se sim, a partir de quando?
2.2 - Irá cobrar valor fixo de juro ou percentual e qual o seu respectivo valor
from opencnabphp.
@Rctnet @gildonei
Segue as ocorrências que o banco acusou e o código que estou utilizando
==> OCORRÊNCIAS
1- Registro inválido na linha 1. O tamanho do registro deve ser de 240 posições.
2 - Campo inválido na linha 1. Tipo de registro [Header de Arquivo]. O campo [Código de Transmissão], posição 33 a 47, deve ser [066000009452079. Definido em Cadastros > Empresas]. Valor atual [066000001300290].
3 - Campo inválido na linha 1. Tipo de registro [Header de Arquivo]. O campo [Reservado (uso Banco)], posição 48 a 72, deve ser [Brancos]. Valor atual [52 ].
4 - Campo inválido na linha 1. Tipo de registro [Header de Arquivo]. O campo [Código remessa], posição 143 a 143, deve ser [1]. Valor atual [ ].
5 - Campo inválido na linha 1. Tipo de registro [Header de Arquivo]. O campo [Data de geração do arquivo], posição 144 a 151, deve ser [DDMMAAAA]. Valor atual [ 1270420].
6 - Campo inválido na linha 1. Tipo de registro [Header de Arquivo]. O campo [Reservado (uso Banco)], posição 152 a 157, deve ser [Brancos]. Valor atual [18 ].
7 - Campo inválido na linha 1. Tipo de registro [Header de Arquivo]. O campo [Nº seqüencial do arquivo], posição 158 a 163, deve ser [diferente de zeros, maior que zero]. Valor atual [ 0000].
8 - Campo inválido na linha 1. Tipo de registro [Header de Arquivo]. O campo [Nº da versão do layout do arquivo], posição 164 a 166, deve ser [040] . Valor atual [340].
9 - Campo inválido na linha 1. Tipo de registro [Header de Arquivo]. O campo [Reservado (uso Banco)], posição 167 a 240, deve ser [Brancos]. Valor atual [40 ].
10 = Campo inválido na linha 3. Tipo de registro [Detalhe - Segmento P]. O campo [Espécie do título], posição 107 a 108, deve ser [02] DM Duplicata Mercantil ou [04] DS Duplicata de Serviço ou [07] LC - LETRA DE CÂMBIO (SOMENTE PARA BANCO 353) ou [12] NP Nota Promissória ou [13] NPR Nota Promissória Rural ou [17] RC Recibo ou [18] FAT Fatura ou [20] AP Apólice de Seguro ou [30] LC - LETRA DE CÂMBIO (SOMENTE PARA BANCO 008) ou [31] BCC - Boleto Cartão de crédito 'À partir de julho/2017' ou [32] BDP – BOLETO DE PROPOSTA ou [97] CH – CHEQUE ou [98] ND - NOTA PROMISSORIA DIRETA. Valor atual [01].
11 - Campo inválido na linha 3. Tipo de registro [Detalhe - Segmento P]. O campo [Código do juros de mora], posição 118 a 118, deve ser [1] Valor por dia - Informar no campo o valor/dia a mora a ser cobrada. ou [2] Taxa Mensal - Informar no campo taxa mensal o percentual a ser aplicado sobre valor do titulo que será calculado por dia de atraso. ou [3] Isento ou [4] Utilizar comissão permanência do Banco por dia de atraso ou [5] Tolerância valor por dia (cobrar juros a partir de) ou [6] Tolerância taxa mensal (cobrar juros a partir de). Valor atual [0].
12 - Campo inválido na linha 6. Tipo de registro [Detalhe - Segmento P]. O campo [Identificação do título no Banco], posição 45 a 57, Digito verificador inserido: 8, Digito verificador valido: 7 [Digito verificador do nosso número é invalido.]. Valor atual [0000000000338].
==> CÓDIGO
public function gerar(){
$this->tipo = "remessa";
$this->data = date("Y-m-d");
$this->conteudo = "";
$this->path = "";
$this->status = 1;
$this->adicionar();
$responseEmpresa = $this->empresa->get(FALSE);
$agencia = explode("-", $responseEmpresa->agencia);
$conta = explode("-", $responseEmpresa->conta);
$contaFidc = explode("-", $responseEmpresa->contaFidc);
$arquivo = new Remessa("033", 'cnab240', array(
'nome_empresa' => $responseEmpresa->nomeFantasia, // seu nome de empresa
'tipo_inscricao' => 2, // 1 para cpf, 2 cnpj
'numero_inscricao' => $responseEmpresa->cnpj, // seu cpf ou cnpj completo
'agencia' => $agencia[0], // agencia sem o digito verificador
'agencia_dv' => $agencia[1], // somente o digito verificador da agencia
'conta' => $conta[0], // número da conta
'conta_dv' => $conta[1], // digito da conta
'codigo_beneficiario' => $conta[0],
'codigo_beneficiario_dv' => $conta[1], // codigo fornecido pelo banco
'codigo_transmissao' => $responseEmpresa->codigoTransmissao,
'numero_sequencial_arquivo' => $this->id,
'situacao_arquivo' =>'P' // use T para teste e P para produção
));
$lote = $arquivo->addLote(array('tipo_servico' => 1, 'codigo_transmissao' => $responseEmpresa->codigoTransmissao)); // tipo_servico = 1 para cobrança registrada, 2 para sem registro
$responseBoletos = $this->boleto->getByIdsParcelas($dados["boleto"], FALSE);
$idsBoletos = [];
foreach ($responseBoletos as $boleto) {
$lote->inserirDetalhe([
'conta_cobranca' => $conta[0], //1 = Entrada de título, para outras opções ver nota explicativa C004 manual Cnab_SIGCB na pasta docs
'codigo_movimento' => 1, //1 = Entrada de título, para outras opções ver nota explicativa C004 manual Cnab_SIGCB na pasta docs
'nosso_numero' => $boleto->nossoNumero, // numero sequencial de boleto
'seu_numero' => $boleto->idParcela, // numero sequencial de boleto
'especie_titulo' => "DM", // Valor do boleto como float valido em php
'valor' => $boleto->valor, // Valor do boleto como float valido em php
'emissao_boleto' => 2, // tipo de emissao do boleto informar 2 para emissao pelo beneficiario e 1 para emissao pelo banco
'nome_pagador' => $boleto->nome, // O Pagador é o cliente, preste atenção nos campos abaixo
'tipo_inscricao' => 1, //campo fixo, escreva '1' se for pessoa fisica, 2 se for pessoa juridica
'numero_inscricao' => $boleto->cpf, //cpf ou ncpj do pagador
'cidade_pagador' => $boleto->cidade,
'uf_pagador' => $boleto->uf,
'data_vencimento' => $boleto->vencimento, // informar a data neste formato
'data_emissao' => $boleto->dataEmissao, // informar a data neste formato
'endereco_pagador' => "Endereço",
'bairro_pagador' => 'Bairro',
'cep_pagador' => '00000-000', // com hífem
'mensagem' => "{$boleto->instrucao1}</br>"
. "{$boleto->instrucao2}</br>"
. "{$boleto->instrucao3}</br>"
. "{$boleto->instrucao4}</br>",
'vlr_juros' => 0, // Valor do juros de 1 dia'
'data_multa' => date("Y-m-d", strtotime("+30 days", strtotime($boleto->vencimento))), // informar a data neste formato, // data da multa
'vlr_multa' => 30.00, // valor da multa
'taxa_multa' => 2.00, // taxa de multa em percentual
'taxa_juros' => 4.00, // taxa de juros em percentual
]);
array_push($idsBoletos, $boleto->id);
}
$resultado = utf8_decode($arquivo->getText()); // observar a header do seu php para não gerar comflitos de codificação de caracteres;
$file = 'remessa-' . date("Y-m-d_H:i:s") . '.rem';
file_put_contents("./assets/arquivos/remessas/{$file}", $resultado);
if (file_exists("./assets/arquivos/remessas/{$file}")) {
$this->conteudo = $resultado;
$this->path = $file;
$this->status = 1;
$this->atualizar();
$this->boleto->baixaRemessa($idsBoletos, $this->data);
return ["resultado" => TRUE, "msg" => "Remessa gerada", "file" => $file];
} else {
return ["resultado" => FALSE, "msg" => "Falha ao gerar remessa"];
}
}
Respondendo as perguntas
1 - Sim, acredito que seja a mora diária após o vencimento
1.1 - No dia seguinte começa a cobrança da mora diária
1.2 - A cobrança de R$ 0,33 ao dia
2 - Sim
2.1 - Os juros serão cobrados 10 dias após o vencimento
2.2 - A cobrança será percentual. 2%
from opencnabphp.
Olá @Guilherme00 , os erros ali em cima são auto-explicativos, vou repassar o exemplo de uso que acredito será mais fácil para você.
O Código de Transmissão é enviado pelo Santander e para o layout de 240 posições deve ter a seguinte regra:
//AGÊNCIA(4 dígitos) + 0000 (zeros fixo) + CONVENIO (6 dígitos) + DV Convênio (1 dígito)
//Exemplo de código de transmissão:
//AG: 1234
//Fixo: 0000
//Convênio: 123456
//Dv Convênio: 7
//Código de Transmissão será: 123400001234567
$arquivo = new Remessa('033', 'cnab240', [
'nome_empresa' => 'nome da sua empresa',
'tipo_inscricao' => 2, // CNPJ
'numero_inscricao' => 'Número do CNPJ da empresa',
'codigo_transmissao' => 'Código de Transmissão',// seria o 123400001234567
'numero_sequencial_arquivo' => 'Código sequencial da sua remessa - pode ser o seu Id no banco de dados',
'situacao_arquivo' => 'T',
'agencia' => 'Agencia', // No exemplo seria 1234
'agencia_dv' => 'Dígito da agência',
'conta' => 'Número da conta no banco',
'conta_dv' => 'dv da conta no banco',
'codigo_beneficiario' => 'Convênio', // No exemplo seria 123456
'codigo_beneficiario_dv' => 'Dv do convênio', // No exemplo seria o 7
]);
$lote = $arquivo->addLote([
'tipo_servico'=> 1,
'codigo_transmissao' => 'Código de transmissao',// Seria 123400001234567
]);
// Aqui você esta tendo problemas com os itens
$detalhe = [
'tipo_cobranca' => 5, // Carteira 5 é a registro simples, o banco informa a correta
'nosso_numero' => 'código do seu boleto',
'seu_numero' => 'código do seu boleto',// Repete
'data_vencimento' => date('Y-m-d'),
'valor' => '100.00',
'data_emissao' => date('Y-m-d'),
'codigo_juros' => '2', // Taxa Mensal (veja que estou cobrando % de juro)
'data_juros' => date('Y-m-d'),
'vlr_juros' => '33.3', // Valor da mora/dia ou Taxa mensal (equivale a 0,033% por dia de JURO)
'codigo_multa' => 2, // Percentual
'data_multa' => $dtVencimento->format('Y-m-d'),
'vlr_multa' => '2',
'codigo_desconto' => '0', // Valor fixo ate a data informada – Informar o valor no campo "valor de desconto a ser concedido"
'data_desconto' => '0',
'vlr_desconto' => '0',
'protestar' => '0', // NÃO PROTESTAR
'prazo_protesto' => '0', // Informar o número de dias apos o vencimento para iniciar o protesto
'baixar' => '2', // NÃO BAIXAR
'prazo_baixar' => '0',
'nome_pagador' => 'Nome do Pagador',
'tipo_inscricao' => 'Tipo de pagador', // 1 - CPF | 2 CNPJ
'numero_inscricao' => 'Número do documento', // CPF ou CNPJ do pagador
'endereco_pagador' => 'Logradouro',
'bairro_pagador' => 'bairro',
'cep_pagador' => 'cep', // 00000-000
'cidade_pagador' => 'cidade',
'uf_pagador' => 'Sigla do Estado', // SC- por exemplo
];
$lote->inserirDetalhe($arrDetalhe);
// Continue normalmente
Você pode inserir isto dentro de um loop ou qualquer outra estrutura de controle que tiver, o principal está ali nos códigos de multa e juros q vc não está informando nos detalhes, além do código de transmissão.
from opencnabphp.
@gildonei obrigado pelas instruções, vou aplicar as correções e dou um retorno.
from opencnabphp.
@gildonei a remessa passou no teste do Santander, porém está dando inconsistência na linha digitável e no código de barras, não bateu com a remessa.
Alguma chance do problema ser na geração da remessa ?
Estou usando o OpenBoleto p/ geração de boletos
from opencnabphp.
@Guilherme00 A remessa não tem haver com o seu boleto. A remessa tem por finalidade apenas avisar ao banco os títulos que você deseja registrar para que o banco saiba de sua existência.
O problema está na sua biblioteca de geração de boleto.
Passe o link do projeto ou lib do OpenBoleto q vc está usando
from opencnabphp.
https://github.com/kriansa/openboleto
from opencnabphp.
Já utilizei este projeto com outros bancos e funcionou normalmente.
Certifique-se de estar informando os dados corretamente, em especial a carteira que para o Santander é diferente na Remessa e no Boleto. No boleto se não me engano a carteira é a 101, mas é bom confirmar com o banco.
Se possível imprima um boleto pelo sistema do banco e compare com o impresso pelo seu sistema próprio e coloque aqui a linha digitável, pois a representação do código de barras é padrão 2of5 independentemente do banco e é gerada a partir da linha digitável.
Se as linhas digitáveis forem iguais em ambos os bancos, o código de barras será o mesmo.
from opencnabphp.
Não acredito que seja o OpenBoleto, em um outro projeto que me passaram como modelo utilizam o projeto e fazem a geração da remessa com o código próprio deles, a carteira é a mesma deles 101.
Essa foi a inconsistência que acusaram.
from opencnabphp.
from opencnabphp.
Quando gero a remessa, preciso setar o Nosso Número com o Módulo 11 ?
Atualmente, quando gero o boleto eu pego o Nosso Número que ele gera e salvo no banco, na geração da remessa apenas recupero o Nosso Número que está salvo e seto no array do detalhe, está correto ?
from opencnabphp.
from opencnabphp.
Provável que seja essa trocar de informações que esteja dando inconsistência entre os boletos e a remessa.
Uma dúvida,
Quando gero o boleto eu informo o número sequencial do boleto no meu sistema (ID:123), quando informar na remessa basta informar o numero sequencial direto ("nosso_numero"=>123) ?
from opencnabphp.
from opencnabphp.
@gildonei realmente parece ser algo na geração da remessa.
Fiz o teste com o Nosso Número processado e com o Sequencial e o resultado na remessa foi similar e a ocorrência persistiu, em contato com o analista de implantação do banco, o nosso número está contendo um número a mais, exemplo
O boleto gera o Nosso Número: 0000000000404
E a remessa: 00000000004049
Está aparecendo mais um dígito dando a entender que o Nosso Número seria 4049 ao invés de 404.
Aqui a geração do boleto p/ persistiu no banco
$boleto = new Santander([
// Parâmetros obrigatórios
'dataVencimento' => new DateTime($dados["vencimento"]),
'valor' => $dados["valor"],
'sequencial' => $dados["idParcela"], // Até 13 dígitos
'sacado' => $sacado,
'cedente' => $cedente,
'agencia' => $agencia[0], // Até 4 dígitos
'carteira' => $responseEmpresa->carteira, // 101, 102 ou 201
'conta' => $responseEmpresa->codigoPsk, // Código do cedente: Até 7 dígitos
// IOS – Seguradoras (Se 7% informar 7. Limitado a 9%)
// Demais clientes usar 0 (zero)
'ios' => $responseEmpresa->ios, // Apenas para o Santander
// Parâmetros recomendáveis
'logoPath' => base_url("assets/img/marca.png"), // Logo da sua empresa
'agenciaDv' => $agencia[1],
'contaDv' => $conta[1],
'descricaoDemonstrativo' => [// Até 5
"Parcela {$dados["parcela"]}/{$dados["totalParcelamento"]}",
"Após vencimento, juros de 1,99% ao mês"
],
'instrucoes' => [// Até 8
"Parcela {$dados["parcela"]}/{$dados["totalParcelamento"]}",
$dados["instrucao1"],
$dados["instrucao2"],
$dados["instrucao3"],
$dados["instrucao4"]
]
]);
Aqui a geração da remessa
$lote->inserirDetalhe([
'especie_titulo' => "DS",
'tipo_cobranca' => 5,
//COM O NOSSO NÚMERO PURO
'nosso_numero' => $boleto->nossoNumero, // numero sequencial de boleto
'seu_numero' => $boleto->nossoNumero, // numero sequencial de boleto
//COM O CÓDIGO SEQUENCIAL DO BOLETO
// 'nosso_numero' => $boleto->idParcela, // numero sequencial de boleto
// 'seu_numero' => $boleto->idParcela, // numero sequencial de boleto
'data_vencimento' => $boleto->vencimento, // informar a data neste formato
'valor' => $boleto->valor, // Valor do boleto como float valido em php
'data_emissao' => $boleto->dataEmissao, // informar a data neste formato
'codigo_juros' => '2',
'data_juros' => date("Y-m-d", strtotime("+1 days", strtotime($boleto->vencimento))),
'vlr_juros' => "199",
'codigo_multa' => '2',
'data_multa' => date("Y-m-d", strtotime("+30 days", strtotime($boleto->vencimento))),
'vlr_multa' => 200,
'codigo_desconto' => '0', // Valor fixo ate a data informada – Informar o valor no campo "valor de desconto a ser concedido"
'data_desconto' => '0',
'vlr_desconto' => '0',
'protestar' => '0', // NÃO PROTESTAR
'prazo_protesto' => '0', // Informar o número de dias apos o vencimento para iniciar o protesto
'baixar' => '2', // NÃO BAIXAR
'prazo_baixar' => '0',
'nome_pagador' => $boleto->nome, // O Pagador é o cliente, preste atenção nos campos abaixo
'tipo_inscricao' => 1, //campo fixo, escreva '1' se for pessoa fisica, 2 se for pessoa juridica
'numero_inscricao' => $boleto->cpf, //cpf ou ncpj do pagador
'cidade_pagador' => $boleto->cidade,
'uf_pagador' => $boleto->uf,
'endereco_pagador' => "Endereço",
'bairro_pagador' => 'Bairro',
'cep_pagador' => '00000-000', // com hífem
'mensagem' => "Após vencimento, juros de 1,99% ao mês"
]);
Aqui as duas remessas geradas com o Nosso Número processado e com o Sequencial do boleto
COM NOSSO NUMERO PROCESSADO.txt
COM NUMERO SEQUENCIAL.txt
from opencnabphp.
from opencnabphp.
Em contato com o Analista deles, a remessa está correta. O problema está na impressão do boleto mesmo, esse dígito verificador não está sendo gerado na linha digitável por isso a inconsistência.
Mas sinceramente, não entendo por que está acusando essa ocorrência sendo que testei no outro sistema e o boleto não continua o DV na impressão do boleto.
from opencnabphp.
@gildonei onde encontro no projeto essa calculadora, procurei e não encontrei
from opencnabphp.
https://github.com/QuilhaSoft/OpenCnabPHP-Docs
from opencnabphp.
Ontem remessa e boletos foram aprovados pelo Santander, vamos avançar p/ os testes de retorno mas acredito que vá dar tudo certo.
O problema estava no Nosso Número que vai no boleto, eu não sabia que o Sequencial deveria ir junto com o DV do Nosso Número.
Assim que os testes forem concluídos dou um retorno p/ fechar esse tópico.
from opencnabphp.
Boa tarde, estou com uma duvida, o codigo_juros no que estou fazendo porém ele não aparece
na remessa
'codigo_juros' => array(
'tamanho' => 1,
'default' => '0',
'tipo' => 'int',
'required' => true
),
poderia me dar uma luz
from opencnabphp.
Bom dia @insidewill , fiz um teste simples adicionando 'codigo_juros'=> 2, no array de inserirDetalhe e funcionou certingo.
from opencnabphp.
Estranho, vou realizar novamente o teste e ver e retorno
from opencnabphp.
Related Issues (20)
- homologação BB com bronca nos Juros, mora e valor pago no retorno HOT 6
- Erro arquivo Caixa Versão Layout de Remessa HOT 1
- Erro Código convênio Bradesco HOT 1
- Estou tentando ler um arquivo CNAB com retorno é do Itau.
- Implementação Banco Safra HOT 4
- Leitura de remessa HOT 2
- Capturar dados do Header HOT 5
- Email pagador no arquivo de remessa
- Instalação laravel HOT 1
- _
- Retorno Santander abs( PHP 8
- Erro ao submeter remessa ao bradesco
- Multa do Itau não está sendo adicionada HOT 2
- Retorno do santander está quebrado!
- Implementação do layout L060 240 Santander 033 HOT 1
- Problema ao validar arquivo CNAB 240 no Sicoob HOT 3
- Uncaught TypeError: number_format(): Argument #1 ($num) must be of type float, string given in HOT 1
- Deycoval
- Multa no Itaú
- Implemantação Banco Inter
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from opencnabphp.