Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá Pessoal!
Esse é meu primeiro post aqui no imasters.
Eu estou implantando boletos para cobrança em meu site utilizando o Boletophp que é gratuito. Consigo gerar os boletos certinho é muito legal.
Mas o meu Banco (no caso Banco do Brasil) esta exigindo que eu envie o arquivo remessa para eles, mas eu não sei gerar isso em PHP. Achei na net em JAVA, ASP, Delphi mas não em PHP.
E como não queria ficar na mão de pagseguro e afins, gostaria de saber se alguém já fez esse tipo de programação que gera o arquivo remessa para enviar para o Banco.
O padrão que preciso é CNAB 240 POSIÇÕES.
Se alguém precisar eu encontrei na net o do Banco Itaú que é CNAB 400 POSIÇÕES, e tenho também em PHP a leitura do arquivo retorno.
É isso camaradas, quem sabe a gente não consegue fazer uma coisa completa totalmente gratuita pra todo mundo usar, eu me proponho a ajudar.
Abraço!
Vinicius,
Valeu a resposta, mas no meu caso mesmo sendo sem registro, o banco realmente precisa do arquivo remessa pois é uma cooperativa que usa o banco do Brasil para intermediar as operações.
Até fica a dica para o pessoal também, para quem tem empresa ou até conta pessoal eu sugiro vocês abrirem conta numa cooperativa. Não se paga nenhuma mensalidade e olha só o preço que eu pago por boleto e só se ele for pago: R$ 1,35 (cada cooperativa tem um preço diferente, mas é bem mais em conta do que um banco normal). Procure por cooperativas em sua cidade.
Segue o link do manual para quem quiser dar uma olhada pra ajudar a fazer a geração do arquivo remessa, eu ainda não tenho a sabedoria de fazer mas vou continuar tentando:
Boa noite Larry, preciso de gerar o CNAB 400 POSIÇÕES para o itaú e gerar os arquivos de remessa e retorno, você poderia me enviar por gentileza, estou o dia todo procurando e não encotrei nada que me pudesse ajudar.
Fico no aguardo, grato.
Rodrigo
Aí Rodrigo, segue o código para gerar arquivo remessa do Banco Itaú. Não testei.
<?php
/*
* @descr: Gera o arquivo de remessa para cobranca no padrao CNAB 400 vers. 7.0 ITAU
*/
function limit($palavra,$limite)
{
if(strlen($palavra) >= $limite)
{
$var = substr($palavra, 0,$limite);
}
else
{
$max = (int)($limite-strlen($palavra));
$var = $palavra.complementoRegistro($max,"brancos");
}
return $var;
}
function sequencial($i) if($i < 10)
{
return zeros(0,5).$i;
}
else if($i > 10 && $i < 100)
{
return zeros(0,4).$i;
}
else if($i > 100 && $i < 1000)
{
return zeros(0,3).$i;
}
else if($i > 1000 && $i < 10000)
{
return zeros(0,2).$i;
}
else if($i > 10000 && $i < 100000)
{
return zeros(0,1).$i;
}
}
function zeros($min,$max) $x = ($max - strlen($min));
for($i = 0; $i < $x; $i++)
{
$zeros .= '0';
}
return $zeros.$min;
}
function complementoRegistro($int,$tipo) if($tipo == "zeros")
{
$space = '';
for($i = 1; $i <= $int; $i++)
{
$space .= '0';
}
}
else if($tipo == "brancos")
{
$space = '';
for($i = 1; $i <= $int; $i++)
{
$space .= ' ';
}
}
return $space;
}
$fusohorario = 3; // como o servidor de hospedagem é a dreamhost pego o fuso para o horario do brasil
$timestamp = mktime(date("H") - $fusohorario, date("i"), date("s"), date("m"), date("d"), date("Y"));
$DATAHORA['PT'] = gmdate("d/m/Y H:i:s", $timestamp);
$DATAHORA['EN'] = gmdate("Y-m-d H:i:s", $timestamp);
$DATA['PT'] = gmdate("d/m/Y", $timestamp);
$DATA['EN'] = gmdate("Y-m-d", $timestamp);
$DATA['DIA'] = gmdate("d",$timestamp);
$DATA['MES'] = gmdate("m",$timestamp);
$DATA['ANO'] = gmdate("y",$timestamp);
$HORA = gmdate("H:i:s", $timestamp);
define("REMESSA",PATH."sistemas/iMoveG/financeiro/arquivos/",true);
$filename = REMESSA.$DATA['DIA'].$DATA['MES'].$DATA['ANO'].".rm";
$conteudo = '';
$conteudo .= chr(13).chr(10); //essa é a quebra de linha
$clientes[] = array("BOLETO001","Cliente A","11111111111","100,00");
$clientes[] = array("BOLETO002","Cliente B","22222222222","200,00");
$clientes[] = array("BOLETO003","Cliente C","33333333333","300,00");
$clientes[] = array("BOLETO004","Cliente D","44444444444","400,00");
$i = 2;
foreach($clientes as $cliente)
{
## REGISTRO DETALHE (OBRIGATORIO)
#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE
$conteudo .= 1; // tipo registro id registro transacac. 001 001 9(01)
$conteudo .= '02'; // codigo inscricao tipo inscricao empresa 002 003 9(02)
$conteudo .= '00965290700010'; // cnpj da empresa 004 017 9(14)
$conteudo .= 6896; // agencia mantenedora da conta 018 021 9(04)
$conteudo .= '00'; // zeros complemento registro 022 023 9(02)
$conteudo .= '08436'; // conta numero da conta 024 028 9(05)
$conteudo .= 2; // dac dig autoconf conta 029 029 9(01)
$conteudo .= complementoRegistro(4,"brancos"); // brancos complemento registro 030 033 X(04)
$conteudo .= complementoRegistro(4,"zeros"); // CÓD.INSTRUÇÃO/ALEGAÇÃO A SER CANC NOTA 27 034 037 9(04)
$conteudo .= limit($cliente[0],25); // USO / IDENT. DO TÍTULO NA EMPRESA NOTA 2 038 062 X(25)
$conteudo .= complementoRegistro(8,"zeros"); // NOSSO NUMERO / ID TITULO DO BANCO NOTA 3 063 070 9(08)
$conteudo .= '0000000000000'; //QTDE MOEDA NOTA 4 071 083 9(08)V9(5)
$conteudo .= 109; // nº da carteira nº carteira banco 084 086 9(03)
$conteudo .= complementoRegistro(21,"brancos"); // uso do banco ident. oper. no banco 087 107 X(21)
$conteudo .= 'I'; // carteira codigo da carteira NOTA 5 108 108 X(01)
$conteudo .= '01'; // codigo ocorrencia / ident da ocorrencia NOTA 6 109 110 9(02)
$conteudo .= limit('',10); // nº documento / nº documento de cobranca NOTA 18 111 120 X(10)
$conteudo .= '310808'; // vencimento data venc. titulo NOTA 7 121 126 9(06)
$conteudo .= '0000000000000'; // valor titulo valor nominal NOTA 8 127 139 9(11)V9(2)
$conteudo .= 341; // codigo do banco Nº BANCO CÂMARA COMP. 140 142 9(03)
$conteudo .= zeros(0,5); //agencia cobradora / ONDE TÍTULO SERÁ COBRADO NOTA 9 143 147 9(05)
$conteudo .= 15; // especie especie do titulo NOTA 10 148 149 X(02)
$conteudo .= 'A'; // aceite ident de titutlo aceito (A=aceite,N=nao aceite) 150 150 X(01)
$conteudo .= '020808'; // data emissao titulo NOTA 31 151 156 9(06)
$conteudo .= '88'; // instrucao 1 NOTA 11 157 158 X(02)
$conteudo .= '86'; // instrucao 2 NOTA 11 159 160 X(02)
$conteudo .= '0000000000000';// juros de 1 dia valor de mora NOTA 12 161 173 9(11)V9(02)
$conteudo .= zeros(0,6); // desconto até data limite p/ descont 174 179 9(06)
$conteudo .= '0000000000000';// valor desconto a ser concedido NOTA 13 180 192 9(11)V9(02)
$conteudo .= '0000000000000'; // valor I.O.F RECOLHIDO P NOTAS SEGURO NOTA 14 193 205 9(11)V9(02)
$conteudo .= '0000000000000'; // abatimento a ser concedido NOTA 13 206 218 9(11)V9(02)
$conteudo .= '02'; // codigo de inscricao tipo de insc. sacado 01=CPF 02=CNPJ 219 220 9(02)
$conteudo .= '00999999700010'; // numero de inscricao cpf ou cnpj 221 234 9(14)
$conteudo .= limit($cliente[1],30); // nome nome do sacado NOTA 15 235 264 X(30)
$conteudo .= complementoRegistro(10,"brancos");//NOTA 15 complem regist 265 274 X(10)
$conteudo .= limit('',40); // logradouro rua numero e compl sacado 275 314 X(40)
$conteudo .= limit('',12); // bairro bairro do sacado 315 326 X(12)
$conteudo .= zeros(0,8); // cep cep do sacado 327 334 9(08)
$conteudo .= limit('',15); // cidade cidade do sacado 335 349 X(15)
$conteudo .= limit('',2); // estado uf do sacado 350 351 X(02)
$conteudo .= limit('',30); // sacador/avalista sacad ou aval. NOTA 16 352 381 X(30)
$conteudo .= complementoRegistro(4,"brancos");// complemento de regist. 382 385 X(04)
$conteudo .= zeros(0,6); // data de mora data de mora 386 391 9(06)
$conteudo .= zeros(0,2); // prazo qtde de dias NOTA 11(A) 392 393 9(02)
$conteudo .= complementoRegistro(1,"brancos"); // brancos complemento de registr. 394 394 X(01)
$conteudo .= sequencial($i++); // numero sequencial do registro no arquivo 395 400 9(06)
$conteudo .= chr(13).chr(10); //essa é a quebra de linha
/*
## REGISTRO DETALHE (OPCIONAL)
#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE
$conteudo .= 4; // tipo transacao id do registro 001 001 9(01)
$conteudo .= ''; // codigo de inscr tipo inscr. empresa NOTA 1 002 003 9(02)
$conteudo .= ''; // numero de inscr cpf ou cnpj 004 017 9(14)
$conteudo .= ''; // agencia mantenedora conta 018 021 9(04)
$conteudo .= '00'; // zeros complemento de registro 022 023 9(02)
$conteudo .= ''; // conta da empresa 024 028 9(05)
$conteudo .= ''; // DAC autoconf conta 029 029 9(01)
$conteudo .= 109; // n carteira no banco NOTA 5 030 032 9(03)
$conteudo .= ''; // nosso número id titulo banco NOTA 3 033 040 9(08)
$conteudo .= ''; // dac nosso numero NOTA 3 041 041 9(01)
$conteudo .= ''; // sequencia n seq. tipo 4 titulo 042 043 9(02)
$conteudo .= ''; // agencia (01) agencia conta credito 044 047 9(04)
$conteudo .= ''; // conta (01) conta p credito 048 054 9(07)
$conteudo .= ''; // dac (1) autoconf conta credito 055 055 9(01)
$conteudo .= ''; // valor (1) valor p credito NOTA 32 056 068 9(11)V9(02)
$conteudo .= ''; // agencia (2) 069 072 9(04)
$conteudo .= ''; // conta (2) 073 079 9(07)
$conteudo .= ''; // dac (2) 080 080 9(01)
$conteudo .= ''; // valor (2) 081 093 9(11)V9(02)
$conteudo .= ''; // agencia (3) 094 097 9(04)
$conteudo .= ''; // conta (3) 098 104 9(07)
$conteudo .= ''; // dac (3) 105 105 9(01)
$conteudo .= ''; // valor (3) 106 118 9(11)V9(02)
$conteudo .= ''; // agencia (4) 119 122 9(04)
$conteudo .= ''; // conta (4) 123 129 9(07)
$conteudo .= ''; // dac (4) 130 130 9(01)
$conteudo .= ''; // valor (4) 131 143 9(11)V9(02)
$conteudo .= ''; // agencia (5) 144 147 9(04)
$conteudo .= ''; // conta (5) 148 154 9(07)
$conteudo .= ''; // dac (5) 155 155 9(01)
$conteudo .= ''; // valor (5) 156 168 9(11)V9(02)
$conteudo .= ''; // agencia (6) 169 172 9(04)
$conteudo .= ''; // conta (6) 173 179 9(07)
$conteudo .= ''; // dac (6) 180 180 9(01)
$conteudo .= ''; // valor (6) 181 193 9(11)V9(02)
$conteudo .= ''; // agencia (7) 194 197 9(04)
$conteudo .= ''; // conta (7) 198 204 9(07)
$conteudo .= ''; // dac (7) 205 205 9(01)
$conteudo .= ''; // valor (7) 206 218 9(11)V9(02)
$conteudo .= ''; // agencia (8) 219 222 9(04)
$conteudo .= ''; // conta (8) 223 229 9(07)
$conteudo .= ''; // dac (8) 230 230 9(01)
$conteudo .= ''; // valor (8) 231 243 9(11)V9(02)
$conteudo .= ''; // agencia (9) 244 247 9(04)
$conteudo .= ''; // conta (9) 248 254 9(07)
$conteudo .= ''; // dac (9) 255 255 9(01)
$conteudo .= ''; // valor (9) 256 268 9(11)V9(02)
$conteudo .= ''; // agencia (10) 269 272 9(04)
$conteudo .= ''; // conta (10) 273 079 9(07)
$conteudo .= ''; // dac (10) 280 280 9(01)
$conteudo .= ''; // valor (10) 281 293 9(11)V9(02)
$conteudo .= ''; // agencia (11) 294 297 9(04)
$conteudo .= ''; // conta (11) 298 304 9(07)
$conteudo .= ''; // dac (11) 305 305 9(01)
$conteudo .= ''; // valor (11) 306 318 9(11)V9(02)
$conteudo .= ''; // agencia (12) 319 322 9(04)
$conteudo .= ''; // conta (12) 323 329 9(07)
$conteudo .= ''; // dac (12) 330 330 9(01)
$conteudo .= ''; // valor (12) 331 343 9(11)V9(02)
$conteudo .= ''; // agencia (13) 344 347 9(04)
$conteudo .= ''; // conta (13) 348 354 9(07)
$conteudo .= ''; // dac (13) 355 355 9(01)
$conteudo .= ''; // valor (13) 356 368 9(11)V9(02)
$conteudo .= ''; // agencia (14) 369 372 9(04)
$conteudo .= ''; // conta (14) 373 379 9(07)
$conteudo .= ''; // dac (14) 380 380 9(01)
$conteudo .= ''; // valor (14) 381 393 9(11)V9(02)
$conteudo .= ''; // tipo de valor informado NOTA 32 394 394 9(01)
$conteudo .= ''; // numero sequencial de registro no arquivo 395 400 9(06)
*/
/*
IMPORTANTE:
· O arquivo pode conter tanto títulos de cobrança normal como títulos de cobrança com rateio de crédito;
· Para instruções de protesto, os títulos com rateio de crédito seguem os mesmos procedimentos dos títulos sem rateio;
· O rateio de crédito pode ser por percentual ou em valor (vide Nota 32);
· Títulos com rateio de crédito – Para cada Registro Detalhe Obrigatório (Tipo de Registro “1”) podem ser utilizados até 3 (três) Registros
Tipo “4” para indicação dos detalhes do rateio de crédito (máximo de 30 contas por título). Caso a Agência/Conta/Dac do cedente e Nº
da Carteira/Nosso Número do título, informados nos registros Tipo “4” não coincidam com os dados do respectivo registro Tipo “1”, a
entrada do título é aceita sem rateio de crédito (os registros Tipo “4” são desprezados);
· A entrada do título é rejeitada nos casos em que a soma dos valores ou percentuais de rateio (informados nos registros Tipo “4”)
ultrapasse o valor nominal do título do registro Tipo “1”;
· Caso os registros de rateio (Tipo “4”) não apresentem agências/contas de crédito, os registros Tipo 4 são desprezados e o título será
tratado como entrada de cobrança normal, sem rateio;
· A agência/conta do cedente e sua respectiva agência/conta centralizadora de crédito da cobrança, não podem estar entre as
agências/contas beneficiárias do rateio de crédito;
· Títulos com rateio de crédito não aceitam instruções de Desconto ou de Abatimento e não permitem alteração dos valores nominal e de
crédito;
· Não haverá incidência de CPMF quando a raiz do CPNJ da conta do cedente for igual a da conta de crédito do rateio.
*/
/*
$conteudo .= chr(13).chr(10); //essa é a quebra de linha
## REGISTRO DETALHE (OPCIONAL)
#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE
$conteudo .= 5; // tipo de registro id reg transac 001 001 9(01)
$conteudo .= ''; // endereco de email do sacado NOTA 29 002 121 X(120)
$conteudo .= ''; // codigo de inscr sacador/avalista NOTA 30 122 123 9(02)
$conteudo .= ''; // numero de inscr sacador/avalista NOTA 30 124 137 9(14)
$conteudo .= ''; // logradouro sacador/avalista NOTA 30 138 177 X(40)
$conteudo .= ''; // bairro sacador/avalista NOTA 30 178 189 X(12)
$conteudo .= ''; // cep sacador/avalista NOTA 30 190 197 9(08)
$conteudo .= ''; // cidade sacador/avalista NOTA 30 198 212 X(15)
$conteudo .= ''; // estado sacador/avalista NOTA 30 213 214 X(02)
$conteudo .= complementoRegistro(180,"brancos");// brancos complem regist 215 394 X(180)
$conteudo .= ''; // numero sequencial do registro no arquivo 395 400 9(06)
*/
/*
IMPORTANTE:
· Este registro é opcional e deverá ser enviado apenas quando o Cedente desejar que o BOLETO de
cobrança seja entregue pelo Banco Itaú ao Sacado por e-mail e/ou, em substituição ou complemento
dos dados referentes ao Sacador/Avalista, quando de sua existência; e
· Sempre que for informado, deverá ser na seqüência do registro obrigatório de cobrança (Código de
Registro ‘1’) a que seus dados se referem;
· As informações constantes neste registro não são informadas no “arquivo retorno”;
· Quando as informações referentes ao "Sacador / Avalista" tiverem sido indicadas nos registros “1” e “5”,
prevalecerá sempre a do registro “5";
· Na fase de testes não é possível o envio do BOLETO via e-mail, para tanto, este será emitido e
consistido fisicamente.
*/
}// fecha loop de clientes
//$conteudo .= chr(13).chr(10); //essa é a quebra de linha
/* TENTATIVA SEM SUCESSO
$conteudo .= '9201341 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000000010000000800000000000000 '.sequencial($i);
*/
// Em nosso exemplo, nós vamos abrir o arquivo $filename
// em modo de adição. O ponteiro do arquivo estará no final
// do arquivo, e é pra lá que $conteudo irá quando o
// escrevermos com fwrite().
// 'w+' e 'w' apaga tudo e escreve do zero
// 'a+' comeca a escrever do inicio para o fim preservando o conteudo do arquivo
if (!$handle = fopen($filename, 'w+'))
{
erro("Não foi possível abrir o arquivo ($filename)");
}
// Escreve $conteudo no nosso arquivo aberto.
if (fwrite($handle, "$conteudo") === FALSE)
{
erro("Não foi possível escrever no arquivo ($filename)");
}
fclose($handle);
msg("Arquivo de remessa gerado com sucesso!");
?>
E se alguém puder ajudar no meu caso com o código para gerar arquivo remessa do Banco do Brasil CNAB com 240 Posições ficarei grato.
Abraço!!!
Obrigado Larry, vou testar o código, abraço.
o script ta dando o seguinte erro
Warning: fopen(PATHsistemas/iMoveG/financeiro/arquivos/280810.rm) [function.fopen]: failed to open stream: No such file or directory in C:\xampp\htdocs\banco.php on line 337
Fatal error: Call to undefined function erro() in C:\xampp\htdocs\banco.php on line 339
alguem pode me ajudar?
Jão,
Acredito que você tem mudar essa linha:
define("REMESSA",PATH."sistemas/iMoveG/financeiro/arquivos/",true);
Talvez existão mais mudanças no código a fazer, se alguém tiver sucesso compartilhe a solução aqui no Fórum com o pessoal.
Abraço!
Cara, a remessa não é uma quantidade de boletos que você envia p/ o banco para ele aprovar? Recentemente implementei um boleto no meu cliente e fiz 10 compras onde gerei 10 boletos de valores diferentes. então salvei os 10 arquivos em .pdf e enviei para o banco e eles retornaram que estava tudo OK, e que eu já poderia implementar. Pois o que + importa p/ o banco é o nosso numero. o resto é so frescura.
André,
O arquivo remessa é um arquivo .txt que é enviado ao banco com as informações do boleto com todos esses padrões: http://www.bb.com.br/docs/pub/emp/mpe/dwn/TitulosRemessa.pdf
Não é muito simples de fazer gerar isso, se puder ajudar será bem-vindo!!!
Sim, o arquivo de remessa que você fala é p/ o bb aprovar o seu boleto certo ?
Se a resposta for SIM, vou adiantar que aconteceu a mesma coisa com um do boletophp, que eu criei p/ o banco santander. fiz apenas algumas alterações p/ entrar de acordo com o manual que me enviaram, e ao final me pediram uma 'remessa de boletos p/ aprovação'. o que eu fiz?
Instalei o pdfcreator, imprimir 10 boletos nele(gerou 10 boletos .pdf), anexei os 10 boletos no e-mail e enviei p/ o responsável.
Depois de 4 dias que ele não havia respondido, entrei em contato via fone e ele no mesmo dia me enviou um e-mail falando que os boletos estava aprovados para produção.
>
Sim, o arquivo de remessa que você fala é p/ o bb aprovar o seu boleto certo ?
Se a resposta for SIM, vou adiantar que aconteceu a mesma coisa com um do boletophp, que eu criei p/ o banco santander. fiz apenas algumas alterações p/ entrar de acordo com o manual que me enviaram, e ao final me pediram uma 'remessa de boletos p/ aprovação'. o que eu fiz?
Instalei o pdfcreator, imprimir 10 boletos nele(gerou 10 boletos .pdf), anexei os 10 boletos no e-mail e enviei p/ o responsável.
Depois de 4 dias que ele não havia respondido, entrei em contato via fone e ele no mesmo dia me enviou um e-mail falando que os boletos estava aprovados para produção.
Não é isso não André!
Você está falando de criar boletos e mandar para o banco verificar se eles estão no padrão e dai eles aprovam.
Mas não tem nada a ver com a questão aqui... o que todos estão procurando é uma forma de registrar boletos junto ao banco.
Boletos registrados ou "cobrança registrada" é aquela em que você passa informações para o banco e ele se encarrega de cobrar seus clientes.
Para passar informações para o banco cada banco aceita um formato de arquivo diferente.
Este arquivo é um arquivo de texto que contém dados dos clientes, valores dos boletos etc, etc...
Para enviar este arquivo para o banco você deve gerar ele em PHP e então usar um sistema que o Banco disponibiliza para mandar o arquivo e então o banco vai registrar seus boletos.
Uma coisa é uma coisa, outra coisa é outra coisa beleza??? hehehe
Também quero gerar remessas para o Banco do Brasil.
Se alguém souber tudo mastigadinho e colocar aqui nós vamos ficar ricos e agradecer muito!!
REALIZEI O TESTE E FUNCIONOU COM ALGUMAS MODIFICAÇÕES
<?php
/*
* @descr: Gera o arquivo de remessa para cobranca no padrao CNAB 400 vers. 7.0 ITAU
*/
function limit($palavra,$limite)
{
if(strlen($palavra) >= $limite)
{
$var = substr($palavra, 0,$limite);
}
else
{
$max = (int)($limite-strlen($palavra));
$var = $palavra.complementoRegistro($max,"brancos");
}
return $var;
}
function sequencial($i)
{
if($i < 10)
{
return zeros(0,5).$i;
}
else if($i > 10 && $i < 100)
{
return zeros(0,4).$i;
}
else if($i > 100 && $i < 1000)
{
return zeros(0,3).$i;
}
else if($i > 1000 && $i < 10000)
{
return zeros(0,2).$i;
}
else if($i > 10000 && $i < 100000)
{
return zeros(0,1).$i;
}
}
function zeros($min,$max)
{
$x = ($max - strlen($min));
for($i = 0; $i < $x; $i++)
{
$zeros .= '0';
}
return $zeros.$min;
}
function complementoRegistro($int,$tipo)
{
if($tipo == "zeros")
{
$space = '';
for($i = 1; $i <= $int; $i++)
{
$space .= '0';
}
}
else if($tipo == "brancos")
{
$space = '';
for($i = 1; $i <= $int; $i++)
{
$space .= ' ';
}
}
return $space;
}
$fusohorario = 3; // como o servidor de hospedagem é a dreamhost pego o fuso para o horario do brasil
$timestamp = mktime(date("H") - $fusohorario, date("i"), date("s"), date("m"), date("d"), date("Y"));
$DATAHORA['PT'] = gmdate("d/m/Y H:i:s", $timestamp);
$DATAHORA['EN'] = gmdate("Y-m-d H:i:s", $timestamp);
$DATA['PT'] = gmdate("d/m/Y", $timestamp);
$DATA['EN'] = gmdate("Y-m-d", $timestamp);
$DATA['DIA'] = gmdate("d",$timestamp);
$DATA['MES'] = gmdate("m",$timestamp);
$DATA['ANO'] = gmdate("y",$timestamp);
$HORA = gmdate("H:i:s", $timestamp);
$HORA1 = gmdate("His", $timestamp);
define("REMESSA",$PATH."imagem/remessa/",true);
$filename = REMESSA.$DATA['DIA'].$DATA['MES'].$DATA['ANO'].$HORA1.".txt";
$conteudo = '';
#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE
$conteudo .= '0'; // tipo de registro id registro header 001 001 9(01)
$conteudo .= 1; // operacao tipo operacao remessa 002 002 9(01)
$conteudo .= 'REMESSA'; // literal remessa escr. extenso 003 009 X(07)
$conteudo .= '01'; // codigo servico id tipo servico 010 011 9(02)
$conteudo .= limit('COBRANCA',15); // literal cobranca escr. extenso 012 026 X(15)
$conteudo .= 1234; // agencia mantenedora conta 027 030 9(04)
$conteudo .= complementoRegistro(2,"zeros");// zeros complemento d registro 031 032 9(02)
$conteudo .= '01234'; // conta conta da empresa 033 037 9(05)
$conteudo .= 2; // dac digito autoconf conta 038 038 9(01)
$conteudo .= complementoRegistro(8,"brancos");// complemento registro 039 046 X(08)
$conteudo .= limit('NOME DA SUA EMPRESA',30);//nome da empresa 047 076 X(30)
$conteudo .= 341; // codigo banco Nº BANCO CÂMARA COMP. 077 079 9(03)
$conteudo .= limit('BANCO ITAU SA',15); // nome do banco por ext. 080 094 X(15)
$conteudo .= $DATA['DIA'].$DATA['MES'].$DATA['ANO'];//data geracao arquivo 095 100 9(06)
$conteudo .= complementoRegistro(294,"brancos");// complemento de registr 101 394 X(294)
$conteudo .= sequencial(1); // numero sequencial registro no arquivo 395 400 9(06)
$conteudo .= chr(13).chr(10); //essa é a quebra de linha
$clientes[] = array("BOLETO001","Cliente A","11111111111","100,00");
$clientes[] = array("BOLETO002","Cliente B","22222222222","200,00");
$clientes[] = array("BOLETO003","Cliente C","33333333333","300,00");
$clientes[] = array("BOLETO004","Cliente D","44444444444","400,00");
$i = 2;
foreach($clientes as $cliente)
{
## REGISTRO DETALHE (OBRIGATORIO)
#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE
$conteudo .= 1; // tipo registro id registro transacac. 001 001 9(01)
$conteudo .= '02'; // codigo inscricao tipo inscricao empresa 002 003 9(02)
$conteudo .= '00965290700010'; // cnpj da empresa 004 017 9(14)
$conteudo .= 6896; // agencia mantenedora da conta 018 021 9(04)
$conteudo .= '00'; // zeros complemento registro 022 023 9(02)
$conteudo .= '08436'; // conta numero da conta 024 028 9(05)
$conteudo .= 2; // dac dig autoconf conta 029 029 9(01)
$conteudo .= complementoRegistro(4,"brancos"); // brancos complemento registro 030 033 X(04)
$conteudo .= complementoRegistro(4,"zeros"); // CÓD.INSTRUÇÃO/ALEGAÇÃO A SER CANC NOTA 27 034 037 9(04)
$conteudo .= limit($cliente[0],25); // USO / IDENT. DO TÍTULO NA EMPRESA NOTA 2 038 062 X(25)
$conteudo .= complementoRegistro(8,"zeros"); // NOSSO NUMERO / ID TITULO DO BANCO NOTA 3 063 070 9(08)
$conteudo .= '0000000000000'; //QTDE MOEDA NOTA 4 071 083 9(08)V9(5)
$conteudo .= 109; // nº da carteira nº carteira banco 084 086 9(03)
$conteudo .= complementoRegistro(21,"brancos"); // uso do banco ident. oper. no banco 087 107 X(21)
$conteudo .= 'I'; // carteira codigo da carteira NOTA 5 108 108 X(01)
$conteudo .= '01'; // codigo ocorrencia / ident da ocorrencia NOTA 6 109 110 9(02)
$conteudo .= limit('',10); // nº documento / nº documento de cobranca NOTA 18 111 120 X(10)
$conteudo .= '310808'; // vencimento data venc. titulo NOTA 7 121 126 9(06)
$conteudo .= '0000000000000'; // valor titulo valor nominal NOTA 8 127 139 9(11)V9(2)
$conteudo .= 341; // codigo do banco Nº BANCO CÂMARA COMP. 140 142 9(03)
$conteudo .= zeros(0,5); //agencia cobradora / ONDE TÍTULO SERÁ COBRADO NOTA 9 143 147 9(05)
$conteudo .= 15; // especie especie do titulo NOTA 10 148 149 X(02)
$conteudo .= 'A'; // aceite ident de titutlo aceito (A=aceite,N=nao aceite) 150 150 X(01)
$conteudo .= '020808'; // data emissao titulo NOTA 31 151 156 9(06)
$conteudo .= '88'; // instrucao 1 NOTA 11 157 158 X(02)
$conteudo .= '86'; // instrucao 2 NOTA 11 159 160 X(02)
$conteudo .= '0000000000000';// juros de 1 dia valor de mora NOTA 12 161 173 9(11)V9(02)
$conteudo .= zeros(0,6); // desconto até data limite p/ descont 174 179 9(06)
$conteudo .= '0000000000000';// valor desconto a ser concedido NOTA 13 180 192 9(11)V9(02)
$conteudo .= '0000000000000'; // valor I.O.F RECOLHIDO P NOTAS SEGURO NOTA 14 193 205 9(11)V9(02)
$conteudo .= '0000000000000'; // abatimento a ser concedido NOTA 13 206 218 9(11)V9(02)
$conteudo .= '02'; // codigo de inscricao tipo de insc. sacado 01=CPF 02=CNPJ 219 220 9(02)
$conteudo .= '00999999700010'; // numero de inscricao cpf ou cnpj 221 234 9(14)
$conteudo .= limit($cliente[1],30); // nome nome do sacado NOTA 15 235 264 X(30)
$conteudo .= complementoRegistro(10,"brancos");//NOTA 15 complem regist 265 274 X(10)
$conteudo .= limit('',40); // logradouro rua numero e compl sacado 275 314 X(40)
$conteudo .= limit('',12); // bairro bairro do sacado 315 326 X(12)
$conteudo .= zeros(0,8); // cep cep do sacado 327 334 9(08)
$conteudo .= limit('',15); // cidade cidade do sacado 335 349 X(15)
$conteudo .= limit('',2); // estado uf do sacado 350 351 X(02)
$conteudo .= limit('',30); // sacador/avalista sacad ou aval. NOTA 16 352 381 X(30)
$conteudo .= complementoRegistro(4,"brancos");// complemento de regist. 382 385 X(04)
$conteudo .= zeros(0,6); // data de mora data de mora 386 391 9(06)
$conteudo .= zeros(0,2); // prazo qtde de dias NOTA 11(A) 392 393 9(02)
$conteudo .= complementoRegistro(1,"brancos"); // brancos complemento de registr. 394 394 X(01)
$conteudo .= sequencial($i++); // numero sequencial do registro no arquivo 395 400 9(06)
$conteudo .= chr(13).chr(10); //essa é a quebra de linha
/*
## REGISTRO DETALHE (OPCIONAL)
#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE
$conteudo .= 4; // tipo transacao id do registro 001 001 9(01)
$conteudo .= ''; // codigo de inscr tipo inscr. empresa NOTA 1 002 003 9(02)
$conteudo .= ''; // numero de inscr cpf ou cnpj 004 017 9(14)
$conteudo .= ''; // agencia mantenedora conta 018 021 9(04)
$conteudo .= '00'; // zeros complemento de registro 022 023 9(02)
$conteudo .= ''; // conta da empresa 024 028 9(05)
$conteudo .= ''; // DAC autoconf conta 029 029 9(01)
$conteudo .= 109; // n carteira no banco NOTA 5 030 032 9(03)
$conteudo .= ''; // nosso número id titulo banco NOTA 3 033 040 9(08)
$conteudo .= ''; // dac nosso numero NOTA 3 041 041 9(01)
$conteudo .= ''; // sequencia n seq. tipo 4 titulo 042 043 9(02)
$conteudo .= ''; // agencia (01) agencia conta credito 044 047 9(04)
$conteudo .= ''; // conta (01) conta p credito 048 054 9(07)
$conteudo .= ''; // dac (1) autoconf conta credito 055 055 9(01)
$conteudo .= ''; // valor (1) valor p credito NOTA 32 056 068 9(11)V9(02)
$conteudo .= ''; // agencia (2) 069 072 9(04)
$conteudo .= ''; // conta (2) 073 079 9(07)
$conteudo .= ''; // dac (2) 080 080 9(01)
$conteudo .= ''; // valor (2) 081 093 9(11)V9(02)
$conteudo .= ''; // agencia (3) 094 097 9(04)
$conteudo .= ''; // conta (3) 098 104 9(07)
$conteudo .= ''; // dac (3) 105 105 9(01)
$conteudo .= ''; // valor (3) 106 118 9(11)V9(02)
$conteudo .= ''; // agencia (4) 119 122 9(04)
$conteudo .= ''; // conta (4) 123 129 9(07)
$conteudo .= ''; // dac (4) 130 130 9(01)
$conteudo .= ''; // valor (4) 131 143 9(11)V9(02)
$conteudo .= ''; // agencia (5) 144 147 9(04)
$conteudo .= ''; // conta (5) 148 154 9(07)
$conteudo .= ''; // dac (5) 155 155 9(01)
$conteudo .= ''; // valor (5) 156 168 9(11)V9(02)
$conteudo .= ''; // agencia (6) 169 172 9(04)
$conteudo .= ''; // conta (6) 173 179 9(07)
$conteudo .= ''; // dac (6) 180 180 9(01)
$conteudo .= ''; // valor (6) 181 193 9(11)V9(02)
$conteudo .= ''; // agencia (7) 194 197 9(04)
$conteudo .= ''; // conta (7) 198 204 9(07)
$conteudo .= ''; // dac (7) 205 205 9(01)
$conteudo .= ''; // valor (7) 206 218 9(11)V9(02)
$conteudo .= ''; // agencia (8) 219 222 9(04)
$conteudo .= ''; // conta (8) 223 229 9(07)
$conteudo .= ''; // dac (8) 230 230 9(01)
$conteudo .= ''; // valor (8) 231 243 9(11)V9(02)
$conteudo .= ''; // agencia (9) 244 247 9(04)
$conteudo .= ''; // conta (9) 248 254 9(07)
$conteudo .= ''; // dac (9) 255 255 9(01)
$conteudo .= ''; // valor (9) 256 268 9(11)V9(02)
$conteudo .= ''; // agencia (10) 269 272 9(04)
$conteudo .= ''; // conta (10) 273 079 9(07)
$conteudo .= ''; // dac (10) 280 280 9(01)
$conteudo .= ''; // valor (10) 281 293 9(11)V9(02)
$conteudo .= ''; // agencia (11) 294 297 9(04)
$conteudo .= ''; // conta (11) 298 304 9(07)
$conteudo .= ''; // dac (11) 305 305 9(01)
$conteudo .= ''; // valor (11) 306 318 9(11)V9(02)
$conteudo .= ''; // agencia (12) 319 322 9(04)
$conteudo .= ''; // conta (12) 323 329 9(07)
$conteudo .= ''; // dac (12) 330 330 9(01)
$conteudo .= ''; // valor (12) 331 343 9(11)V9(02)
$conteudo .= ''; // agencia (13) 344 347 9(04)
$conteudo .= ''; // conta (13) 348 354 9(07)
$conteudo .= ''; // dac (13) 355 355 9(01)
$conteudo .= ''; // valor (13) 356 368 9(11)V9(02)
$conteudo .= ''; // agencia (14) 369 372 9(04)
$conteudo .= ''; // conta (14) 373 379 9(07)
$conteudo .= ''; // dac (14) 380 380 9(01)
$conteudo .= ''; // valor (14) 381 393 9(11)V9(02)
$conteudo .= ''; // tipo de valor informado NOTA 32 394 394 9(01)
$conteudo .= ''; // numero sequencial de registro no arquivo 395 400 9(06)
*/
/*
IMPORTANTE:
· O arquivo pode conter tanto títulos de cobrança normal como títulos de cobrança com rateio de crédito;
· Para instruções de protesto, os títulos com rateio de crédito seguem os mesmos procedimentos dos títulos sem rateio;
· O rateio de crédito pode ser por percentual ou em valor (vide Nota 32);
· Títulos com rateio de crédito – Para cada Registro Detalhe Obrigatório (Tipo de Registro “1”) podem ser utilizados até 3 (três) Registros
Tipo “4” para indicação dos detalhes do rateio de crédito (máximo de 30 contas por título). Caso a Agência/Conta/Dac do cedente e Nº
da Carteira/Nosso Número do título, informados nos registros Tipo “4” não coincidam com os dados do respectivo registro Tipo “1”, a
entrada do título é aceita sem rateio de crédito (os registros Tipo “4” são desprezados);
· A entrada do título é rejeitada nos casos em que a soma dos valores ou percentuais de rateio (informados nos registros Tipo “4”)
ultrapasse o valor nominal do título do registro Tipo “1”;
· Caso os registros de rateio (Tipo “4”) não apresentem agências/contas de crédito, os registros Tipo 4 são desprezados e o título será
tratado como entrada de cobrança normal, sem rateio;
· A agência/conta do cedente e sua respectiva agência/conta centralizadora de crédito da cobrança, não podem estar entre as
agências/contas beneficiárias do rateio de crédito;
· Títulos com rateio de crédito não aceitam instruções de Desconto ou de Abatimento e não permitem alteração dos valores nominal e de
crédito;
· Não haverá incidência de CPMF quando a raiz do CPNJ da conta do cedente for igual a da conta de crédito do rateio.
*/
/*
$conteudo .= chr(13).chr(10); //essa é a quebra de linha
## REGISTRO DETALHE (OPCIONAL)
#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE
$conteudo .= 5; // tipo de registro id reg transac 001 001 9(01)
$conteudo .= ''; // endereco de email do sacado NOTA 29 002 121 X(120)
$conteudo .= ''; // codigo de inscr sacador/avalista NOTA 30 122 123 9(02)
$conteudo .= ''; // numero de inscr sacador/avalista NOTA 30 124 137 9(14)
$conteudo .= ''; // logradouro sacador/avalista NOTA 30 138 177 X(40)
$conteudo .= ''; // bairro sacador/avalista NOTA 30 178 189 X(12)
$conteudo .= ''; // cep sacador/avalista NOTA 30 190 197 9(08)
$conteudo .= ''; // cidade sacador/avalista NOTA 30 198 212 X(15)
$conteudo .= ''; // estado sacador/avalista NOTA 30 213 214 X(02)
$conteudo .= complementoRegistro(180,"brancos");// brancos complem regist 215 394 X(180)
$conteudo .= ''; // numero sequencial do registro no arquivo 395 400 9(06)
*/
/*
IMPORTANTE:
· Este registro é opcional e deverá ser enviado apenas quando o Cedente desejar que o BOLETO de
cobrança seja entregue pelo Banco Itaú ao Sacado por e-mail e/ou, em substituição ou complemento
dos dados referentes ao Sacador/Avalista, quando de sua existência; e
· Sempre que for informado, deverá ser na seqüência do registro obrigatório de cobrança (Código de
Registro ‘1’) a que seus dados se referem;
· As informações constantes neste registro não são informadas no “arquivo retorno”;
· Quando as informações referentes ao "Sacador / Avalista" tiverem sido indicadas nos registros “1” e “5”,
prevalecerá sempre a do registro “5";
· Na fase de testes não é possível o envio do BOLETO via e-mail, para tanto, este será emitido e
consistido fisicamente.
*/
}// fecha loop de clientes
//$conteudo .= chr(13).chr(10); //essa é a quebra de linha
/*
CORRETO LAYOUT ITAU
#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE
$conteudo .= 9; // tipo de registro id registro trailer 001 001 9(01)
$conteudo .= complementoRegistro(393,"zeros"); // brancos complemento de registro 002 394 X(393)
$conteudo .= zeros($sequencial,6); // nº sequencial do regsitro no arquivo 395 400 9(06)
*/
/* TENTATIVA SEM SUCESSO
$conteudo .= '9201341 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000000010000000800000000000000 '.sequencial($i);
*/
// Em nosso exemplo, nós vamos abrir o arquivo $filename
// em modo de adição. O ponteiro do arquivo estará no final
// do arquivo, e é pra lá que $conteudo irá quando o
// escrevermos com fwrite().
// 'w+' e 'w' apaga tudo e escreve do zero
// 'a+' comeca a escrever do inicio para o fim preservando o conteudo do arquivo
if (!$handle = fopen($filename, 'w+'))
{
erro("Não foi possível abrir o arquivo ($filename)");
}
// Escreve $conteudo no nosso arquivo aberto.
if (fwrite($handle, "$conteudo") === FALSE)
{
echo "Não foi possível escrever no arquivo ($filename)";
}
fclose($handle);
echo "Arquivo de remessa gerado com sucesso!";
?>
>
Jão,
Acredito que você tem mudar essa linha:
define("REMESSA",PATH."sistemas/iMoveG/financeiro/arquivos/",true);
Talvez existão mais mudanças no código a fazer, se alguém tiver sucesso compartilhe a solução aqui no Fórum com o pessoal.
Abraço!
Recentemente precisei implementar o processamento de arquivos de retorno de boleto bancário para o meu Sistema de Inscrições On-Line. Assim, resolvi criar um projeto para disponibilizar os fontes para a comunidade e também receber contribuições no desenvolvimento do mesmo, como ocorre com o projeto BoletoPHP.
Desta forma nasce o Retorno-BoletoPHP, um projeto em PHP 5+ que conta com um conjunto de classes para processamento de arquivos de retorno de títulos de cobrança (boleto bancário) de bancos brasileiros. O projeto utiliza Design Patters para permitir sua fácil extensão, sem modificar as classes que já estão funcionando, no conceito “Fechado para alteração e aberto para extensão”.
Atualmente estão implementados os padrões FEBRABAN/CNAB400 E FEBRABAN/CNAB240.
Acessem o projeto em http://github.com/manoelcampos/Retorno-BoletoPHP
Um exemplo online está disponível aqui.
Se inscreve no grupo de discussão do projeto para tirar dúvidas.
retorno-boletophp
Visitar este grupo
Olá bom dia.
Você teria como me passar o arquivo php para fazer a leitura do CNAB 400 do Itau..
Abraço
>
Olá Pessoal!
Esse é meu primeiro post aqui no imasters.
Eu estou implantando boletos para cobrança em meu site utilizando o Boletophp que é gratuito. Consigo gerar os boletos certinho é muito legal.
Mas o meu Banco (no caso Banco do Brasil) esta exigindo que eu envie o arquivo remessa para eles, mas eu não sei gerar isso em PHP. Achei na net em JAVA, ASP, Delphi mas não em PHP.
E como não queria ficar na mão de pagseguro e afins, gostaria de saber se alguém já fez esse tipo de programação que gera o arquivo remessa para enviar para o Banco.
O padrão que preciso é CNAB 240 POSIÇÕES.
Se alguém precisar eu encontrei na net o do Banco Itaú que é CNAB 400 POSIÇÕES, e tenho também em PHP a leitura do arquivo retorno.
É isso camaradas, quem sabe a gente não consegue fazer uma coisa completa totalmente gratuita pra todo mundo usar, eu me proponho a ajudar.
Abraço!
Olá amigos, gostaria de saber se posso usar o código abaixo para gerar arquivos remessa para o santander CNAB400
ou se ele é especifico para itaú, e se for quais alterações tenho que fazer para funcionar com o santander?
e ainda tem a questão do convênio, 7, 6 digitos.. isso é relevante para remessa?
desde já agradeço a todos.
>
Aí Rodrigo, segue o código para gerar arquivo remessa do Banco Itaú. Não testei.
<?php
/*
* @descr: Gera o arquivo de remessa para cobranca no padrao CNAB 400 vers. 7.0 ITAU
*/
function limit($palavra,$limite)
{
if(strlen($palavra) >= $limite)
{
$var = substr($palavra, 0,$limite);
}
else
{
$max = (int)($limite-strlen($palavra));
$var = $palavra.complementoRegistro($max,"brancos");
}
return $var;
}
function sequencial($i) if($i < 10)
{
return zeros(0,5).$i;
}
else if($i > 10 && $i < 100)
{
return zeros(0,4).$i;
}
else if($i > 100 && $i < 1000)
{
return zeros(0,3).$i;
}
else if($i > 1000 && $i < 10000)
{
return zeros(0,2).$i;
}
else if($i > 10000 && $i < 100000)
{
return zeros(0,1).$i;
}
}
function zeros($min,$max) $x = ($max - strlen($min));
for($i = 0; $i < $x; $i++)
{
$zeros .= '0';
}
return $zeros.$min;
}
function complementoRegistro($int,$tipo) if($tipo == "zeros")
{
$space = '';
for($i = 1; $i <= $int; $i++)
{
$space .= '0';
}
}
else if($tipo == "brancos")
{
$space = '';
for($i = 1; $i <= $int; $i++)
{
$space .= ' ';
}
}
return $space;
}
$fusohorario = 3; // como o servidor de hospedagem é a dreamhost pego o fuso para o horario do brasil
$timestamp = mktime(date("H") - $fusohorario, date("i"), date("s"), date("m"), date("d"), date("Y"));
$DATAHORA['PT'] = gmdate("d/m/Y H:i:s", $timestamp);
$DATAHORA['EN'] = gmdate("Y-m-d H:i:s", $timestamp);
$DATA['PT'] = gmdate("d/m/Y", $timestamp);
$DATA['EN'] = gmdate("Y-m-d", $timestamp);
$DATA['DIA'] = gmdate("d",$timestamp);
$DATA['MES'] = gmdate("m",$timestamp);
$DATA['ANO'] = gmdate("y",$timestamp);
$HORA = gmdate("H:i:s", $timestamp);
define("REMESSA",PATH."sistemas/iMoveG/financeiro/arquivos/",true);
$filename = REMESSA.$DATA['DIA'].$DATA['MES'].$DATA['ANO'].".rm";
$conteudo = '';
$conteudo .= chr(13).chr(10); //essa é a quebra de linha
$clientes[] = array("BOLETO001","Cliente A","11111111111","100,00");
$clientes[] = array("BOLETO002","Cliente B","22222222222","200,00");
$clientes[] = array("BOLETO003","Cliente C","33333333333","300,00");
$clientes[] = array("BOLETO004","Cliente D","44444444444","400,00");
$i = 2;
foreach($clientes as $cliente)
{
## REGISTRO DETALHE (OBRIGATORIO)
#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE
$conteudo .= 1; // tipo registro id registro transacac. 001 001 9(01)
$conteudo .= '02'; // codigo inscricao tipo inscricao empresa 002 003 9(02)
$conteudo .= '00965290700010'; // cnpj da empresa 004 017 9(14)
$conteudo .= 6896; // agencia mantenedora da conta 018 021 9(04)
$conteudo .= '00'; // zeros complemento registro 022 023 9(02)
$conteudo .= '08436'; // conta numero da conta 024 028 9(05)
$conteudo .= 2; // dac dig autoconf conta 029 029 9(01)
$conteudo .= complementoRegistro(4,"brancos"); // brancos complemento registro 030 033 X(04)
$conteudo .= complementoRegistro(4,"zeros"); // CÓD.INSTRUÇÃO/ALEGAÇÃO A SER CANC NOTA 27 034 037 9(04)
$conteudo .= limit($cliente[0],25); // USO / IDENT. DO TÍTULO NA EMPRESA NOTA 2 038 062 X(25)
$conteudo .= complementoRegistro(8,"zeros"); // NOSSO NUMERO / ID TITULO DO BANCO NOTA 3 063 070 9(08)
$conteudo .= '0000000000000'; //QTDE MOEDA NOTA 4 071 083 9(08)V9(5)
$conteudo .= 109; // nº da carteira nº carteira banco 084 086 9(03)
$conteudo .= complementoRegistro(21,"brancos"); // uso do banco ident. oper. no banco 087 107 X(21)
$conteudo .= 'I'; // carteira codigo da carteira NOTA 5 108 108 X(01)
$conteudo .= '01'; // codigo ocorrencia / ident da ocorrencia NOTA 6 109 110 9(02)
$conteudo .= limit('',10); // nº documento / nº documento de cobranca NOTA 18 111 120 X(10)
$conteudo .= '310808'; // vencimento data venc. titulo NOTA 7 121 126 9(06)
$conteudo .= '0000000000000'; // valor titulo valor nominal NOTA 8 127 139 9(11)V9(2)
$conteudo .= 341; // codigo do banco Nº BANCO CÂMARA COMP. 140 142 9(03)
$conteudo .= zeros(0,5); //agencia cobradora / ONDE TÍTULO SERÁ COBRADO NOTA 9 143 147 9(05)
$conteudo .= 15; // especie especie do titulo NOTA 10 148 149 X(02)
$conteudo .= 'A'; // aceite ident de titutlo aceito (A=aceite,N=nao aceite) 150 150 X(01)
$conteudo .= '020808'; // data emissao titulo NOTA 31 151 156 9(06)
$conteudo .= '88'; // instrucao 1 NOTA 11 157 158 X(02)
$conteudo .= '86'; // instrucao 2 NOTA 11 159 160 X(02)
$conteudo .= '0000000000000';// juros de 1 dia valor de mora NOTA 12 161 173 9(11)V9(02)
$conteudo .= zeros(0,6); // desconto até data limite p/ descont 174 179 9(06)
$conteudo .= '0000000000000';// valor desconto a ser concedido NOTA 13 180 192 9(11)V9(02)
$conteudo .= '0000000000000'; // valor I.O.F RECOLHIDO P NOTAS SEGURO NOTA 14 193 205 9(11)V9(02)
$conteudo .= '0000000000000'; // abatimento a ser concedido NOTA 13 206 218 9(11)V9(02)
$conteudo .= '02'; // codigo de inscricao tipo de insc. sacado 01=CPF 02=CNPJ 219 220 9(02)
$conteudo .= '00999999700010'; // numero de inscricao cpf ou cnpj 221 234 9(14)
$conteudo .= limit($cliente[1],30); // nome nome do sacado NOTA 15 235 264 X(30)
$conteudo .= complementoRegistro(10,"brancos");//NOTA 15 complem regist 265 274 X(10)
$conteudo .= limit('',40); // logradouro rua numero e compl sacado 275 314 X(40)
$conteudo .= limit('',12); // bairro bairro do sacado 315 326 X(12)
$conteudo .= zeros(0,8); // cep cep do sacado 327 334 9(08)
$conteudo .= limit('',15); // cidade cidade do sacado 335 349 X(15)
$conteudo .= limit('',2); // estado uf do sacado 350 351 X(02)
$conteudo .= limit('',30); // sacador/avalista sacad ou aval. NOTA 16 352 381 X(30)
$conteudo .= complementoRegistro(4,"brancos");// complemento de regist. 382 385 X(04)
$conteudo .= zeros(0,6); // data de mora data de mora 386 391 9(06)
$conteudo .= zeros(0,2); // prazo qtde de dias NOTA 11(A) 392 393 9(02)
$conteudo .= complementoRegistro(1,"brancos"); // brancos complemento de registr. 394 394 X(01)
$conteudo .= sequencial($i++); // numero sequencial do registro no arquivo 395 400 9(06)
$conteudo .= chr(13).chr(10); //essa é a quebra de linha
/*
## REGISTRO DETALHE (OPCIONAL)
#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE
$conteudo .= 4; // tipo transacao id do registro 001 001 9(01)
$conteudo .= ''; // codigo de inscr tipo inscr. empresa NOTA 1 002 003 9(02)
$conteudo .= ''; // numero de inscr cpf ou cnpj 004 017 9(14)
$conteudo .= ''; // agencia mantenedora conta 018 021 9(04)
$conteudo .= '00'; // zeros complemento de registro 022 023 9(02)
$conteudo .= ''; // conta da empresa 024 028 9(05)
$conteudo .= ''; // DAC autoconf conta 029 029 9(01)
$conteudo .= 109; // n carteira no banco NOTA 5 030 032 9(03)
$conteudo .= ''; // nosso número id titulo banco NOTA 3 033 040 9(08)
$conteudo .= ''; // dac nosso numero NOTA 3 041 041 9(01)
$conteudo .= ''; // sequencia n seq. tipo 4 titulo 042 043 9(02)
$conteudo .= ''; // agencia (01) agencia conta credito 044 047 9(04)
$conteudo .= ''; // conta (01) conta p credito 048 054 9(07)
$conteudo .= ''; // dac (1) autoconf conta credito 055 055 9(01)
$conteudo .= ''; // valor (1) valor p credito NOTA 32 056 068 9(11)V9(02)
$conteudo .= ''; // agencia (2) 069 072 9(04)
$conteudo .= ''; // conta (2) 073 079 9(07)
$conteudo .= ''; // dac (2) 080 080 9(01)
$conteudo .= ''; // valor (2) 081 093 9(11)V9(02)
$conteudo .= ''; // agencia (3) 094 097 9(04)
$conteudo .= ''; // conta (3) 098 104 9(07)
$conteudo .= ''; // dac (3) 105 105 9(01)
$conteudo .= ''; // valor (3) 106 118 9(11)V9(02)
$conteudo .= ''; // agencia (4) 119 122 9(04)
$conteudo .= ''; // conta (4) 123 129 9(07)
$conteudo .= ''; // dac (4) 130 130 9(01)
$conteudo .= ''; // valor (4) 131 143 9(11)V9(02)
$conteudo .= ''; // agencia (5) 144 147 9(04)
$conteudo .= ''; // conta (5) 148 154 9(07)
$conteudo .= ''; // dac (5) 155 155 9(01)
$conteudo .= ''; // valor (5) 156 168 9(11)V9(02)
$conteudo .= ''; // agencia (6) 169 172 9(04)
$conteudo .= ''; // conta (6) 173 179 9(07)
$conteudo .= ''; // dac (6) 180 180 9(01)
$conteudo .= ''; // valor (6) 181 193 9(11)V9(02)
$conteudo .= ''; // agencia (7) 194 197 9(04)
$conteudo .= ''; // conta (7) 198 204 9(07)
$conteudo .= ''; // dac (7) 205 205 9(01)
$conteudo .= ''; // valor (7) 206 218 9(11)V9(02)
$conteudo .= ''; // agencia (8) 219 222 9(04)
$conteudo .= ''; // conta (8) 223 229 9(07)
$conteudo .= ''; // dac (8) 230 230 9(01)
$conteudo .= ''; // valor (8) 231 243 9(11)V9(02)
$conteudo .= ''; // agencia (9) 244 247 9(04)
$conteudo .= ''; // conta (9) 248 254 9(07)
$conteudo .= ''; // dac (9) 255 255 9(01)
$conteudo .= ''; // valor (9) 256 268 9(11)V9(02)
$conteudo .= ''; // agencia (10) 269 272 9(04)
$conteudo .= ''; // conta (10) 273 079 9(07)
$conteudo .= ''; // dac (10) 280 280 9(01)
$conteudo .= ''; // valor (10) 281 293 9(11)V9(02)
$conteudo .= ''; // agencia (11) 294 297 9(04)
$conteudo .= ''; // conta (11) 298 304 9(07)
$conteudo .= ''; // dac (11) 305 305 9(01)
$conteudo .= ''; // valor (11) 306 318 9(11)V9(02)
$conteudo .= ''; // agencia (12) 319 322 9(04)
$conteudo .= ''; // conta (12) 323 329 9(07)
$conteudo .= ''; // dac (12) 330 330 9(01)
$conteudo .= ''; // valor (12) 331 343 9(11)V9(02)
$conteudo .= ''; // agencia (13) 344 347 9(04)
$conteudo .= ''; // conta (13) 348 354 9(07)
$conteudo .= ''; // dac (13) 355 355 9(01)
$conteudo .= ''; // valor (13) 356 368 9(11)V9(02)
$conteudo .= ''; // agencia (14) 369 372 9(04)
$conteudo .= ''; // conta (14) 373 379 9(07)
$conteudo .= ''; // dac (14) 380 380 9(01)
$conteudo .= ''; // valor (14) 381 393 9(11)V9(02)
$conteudo .= ''; // tipo de valor informado NOTA 32 394 394 9(01)
$conteudo .= ''; // numero sequencial de registro no arquivo 395 400 9(06)
*/
/*
IMPORTANTE:
· O arquivo pode conter tanto títulos de cobrança normal como títulos de cobrança com rateio de crédito;
· Para instruções de protesto, os títulos com rateio de crédito seguem os mesmos procedimentos dos títulos sem rateio;
· O rateio de crédito pode ser por percentual ou em valor (vide Nota 32);
· Títulos com rateio de crédito – Para cada Registro Detalhe Obrigatório (Tipo de Registro “1”) podem ser utilizados até 3 (três) Registros
Tipo “4” para indicação dos detalhes do rateio de crédito (máximo de 30 contas por título). Caso a Agência/Conta/Dac do cedente e Nº
da Carteira/Nosso Número do título, informados nos registros Tipo “4” não coincidam com os dados do respectivo registro Tipo “1”, a
entrada do título é aceita sem rateio de crédito (os registros Tipo “4” são desprezados);
· A entrada do título é rejeitada nos casos em que a soma dos valores ou percentuais de rateio (informados nos registros Tipo “4”)
ultrapasse o valor nominal do título do registro Tipo “1”;
· Caso os registros de rateio (Tipo “4”) não apresentem agências/contas de crédito, os registros Tipo 4 são desprezados e o título será
tratado como entrada de cobrança normal, sem rateio;
· A agência/conta do cedente e sua respectiva agência/conta centralizadora de crédito da cobrança, não podem estar entre as
agências/contas beneficiárias do rateio de crédito;
· Títulos com rateio de crédito não aceitam instruções de Desconto ou de Abatimento e não permitem alteração dos valores nominal e de
crédito;
· Não haverá incidência de CPMF quando a raiz do CPNJ da conta do cedente for igual a da conta de crédito do rateio.
*/
/*
$conteudo .= chr(13).chr(10); //essa é a quebra de linha
## REGISTRO DETALHE (OPCIONAL)
#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE
$conteudo .= 5; // tipo de registro id reg transac 001 001 9(01)
$conteudo .= ''; // endereco de email do sacado NOTA 29 002 121 X(120)
$conteudo .= ''; // codigo de inscr sacador/avalista NOTA 30 122 123 9(02)
$conteudo .= ''; // numero de inscr sacador/avalista NOTA 30 124 137 9(14)
$conteudo .= ''; // logradouro sacador/avalista NOTA 30 138 177 X(40)
$conteudo .= ''; // bairro sacador/avalista NOTA 30 178 189 X(12)
$conteudo .= ''; // cep sacador/avalista NOTA 30 190 197 9(08)
$conteudo .= ''; // cidade sacador/avalista NOTA 30 198 212 X(15)
$conteudo .= ''; // estado sacador/avalista NOTA 30 213 214 X(02)
$conteudo .= complementoRegistro(180,"brancos");// brancos complem regist 215 394 X(180)
$conteudo .= ''; // numero sequencial do registro no arquivo 395 400 9(06)
*/
/*
IMPORTANTE:
· Este registro é opcional e deverá ser enviado apenas quando o Cedente desejar que o BOLETO de
cobrança seja entregue pelo Banco Itaú ao Sacado por e-mail e/ou, em substituição ou complemento
dos dados referentes ao Sacador/Avalista, quando de sua existência; e
· Sempre que for informado, deverá ser na seqüência do registro obrigatório de cobrança (Código de
Registro ‘1’) a que seus dados se referem;
· As informações constantes neste registro não são informadas no “arquivo retorno”;
· Quando as informações referentes ao "Sacador / Avalista" tiverem sido indicadas nos registros “1” e “5”,
prevalecerá sempre a do registro “5";
· Na fase de testes não é possível o envio do BOLETO via e-mail, para tanto, este será emitido e
consistido fisicamente.
*/
}// fecha loop de clientes
//$conteudo .= chr(13).chr(10); //essa é a quebra de linha
/* TENTATIVA SEM SUCESSO
$conteudo .= '9201341 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000000010000000800000000000000 '.sequencial($i);
*/
// Em nosso exemplo, nós vamos abrir o arquivo $filename
// em modo de adição. O ponteiro do arquivo estará no final
// do arquivo, e é pra lá que $conteudo irá quando o
// escrevermos com fwrite().
// 'w+' e 'w' apaga tudo e escreve do zero
// 'a+' comeca a escrever do inicio para o fim preservando o conteudo do arquivo
if (!$handle = fopen($filename, 'w+'))
{
erro("Não foi possível abrir o arquivo ($filename)");
}
// Escreve $conteudo no nosso arquivo aberto.
if (fwrite($handle, "$conteudo") === FALSE)
{
erro("Não foi possível escrever no arquivo ($filename)");
}
fclose($handle);
msg("Arquivo de remessa gerado com sucesso!");
?>
E se alguém puder ajudar no meu caso com o código para gerar arquivo remessa do Banco do Brasil CNAB com 240 Posições ficarei grato.
Abraço!!!
Nossa galera!! Eu fiz esse código há muitos anos atrás e sem querer acabei encontrando ele de novo.
É uma pena ver que nínguem deixou os créditos no comentário do código, mas sem duvida alguma apenas com esta linha:
define("REMESSA",PATH."sistemas/iMoveG/financeiro/arquivos/",true);
Pude ter certeza total de que o criador do código fui eu.... ao longo destes anos recebi muito contatos no meu email pessoal pedindo para corrigir os bugs, porém nunca mais tive a oportunidade de atualizar ele, mas percebo que não foi necessario muita alteração para a finalização do código.
Não posso exigir nada, pois não postei o código sob licença alguma.
Agradeço a todos que usaram, mas ficaria muito feliz em ter meu nome e email nos créditos!! Abraço.
Não to cobrando nínguem!! Só comentando... abraço!!
Alguem tem o código de leitura do arquivo retorno?
pessoal boa tarde.
estou desenterrando este topico.
no meu sistema financeiro começei a utilizar o boletophp do itau, agora quero gerar arquivo de remessa.
o primeiro passa foi feito, usei este script acima e consegui gerar o txt sem problemas.
alguem que já fez pode me tirar a minha duvida.
nesta parte abaixo:
>
$clientes[] = array("BOLETO001","Cliente A","11111111111","100,00");
$clientes[] = array("BOLETO002","Cliente B","22222222222","200,00");
$clientes[] = array("BOLETO003","Cliente C","33333333333","300,00");
$clientes[] = array("BOLETO004","Cliente D","44444444444","400,00");
$i = 2;
foreach($clientes as $cliente)
{
$conteudo .= chr(13).chr(10); //essa é a quebra de linha
no foreach abaixo dos clientes ele já puxa automaticamente os dados do cliente acima ou tenho que colocar o preenchimento???
Bom dia galera,
Eu queria saber se dá para fazer ao contrário.
Gerar o boleto através do arquivo de remessa.
Se der e alguém já tiver feito me ajudem.
Obrigado.
Gostaria de apresentar uma alternativa que esta sendo desenvolvida:
Anderson tem alguma documentação para ajudar? Tenho interesse em ajudar!!!
Por enquanto estamos sem documentação, somente existe aquele dois exemplos na página do Github.
Entre os próximos passos do desenvolvimento está:
Estou te passando o meu skype por mensagem.
define("REMESSA",PATH."sistemas/iMoveG/financeiro/arquivos/",true);
Prezados,
Alguém pode me dizer o que exatamente faz essa linha no código?
Fiz uma alteração no código removendo esta linha e setando o nome do arquivo e o script funcionou. Antes estava dando erro fopen() por mais que utilizasse o endereço físico correto do diretório onde estava salvando o arquivo de remessa. Permissões de gravação e leitura OK.
Então joguei o script e o arquivo a ser gerado na mesma pasta e funcionou blz.
Obrigado à todos.
Pessoal,
Em nosso site: http://www.remessaphp.com.br vocês poderão baixar gratuitamente os scripts que geram o arquivo de remessa de vários bancos.
Passa lá!
>
Em 25/02/2017 at 14:59, alexandre890 disse:
Pessoal,
Em nosso site: http://www.remessaphp.com.br vocês poderão baixar gratuitamente os scripts que geram o arquivo de remessa de vários bancos.
Passa lá!
Desenterrando esse post pois ele é muito indexado nas buscas: Não é mais gratuito "desde o dia 27/08/2017" conforme descrito no site (http://www.remessaphp.com.br/download.php).
Qual a carteira que você esta utilizando? Até onde eu sei, você pode utilizar a carteira sem registro (acredito que o mais recomendado pra web), onde o banco só saberá da existência do boleto quando ele for pago.
O controle de boletos emitidos, inclusive do número do boleto para que não haja duplicidade, ficaria a seu cargo.
Já implementei este mesmo projeto em outros bancos, e pela carteira sem registro não precisei enviar nenhum arquivo de remessa.
Abraço!