require_once("RetornoBase.php");
/**Classe para leitura de arquivos de retorno de cobranças no padrão CNAB400.
* Layout Padrão CNAB/Febraban 400 posições
.
* Baseado na documentação para "Layout de Arquivo Retorno para Convênios
* na faixa numérica entre 000.001 a 999.999 (Convênios de até 6 posições). Versão Set/09"
* do Banco do Brasil (arquivo CBR643-6_posicoes.pdf)
* @copyright GPLv2
* @package ArquivoRetornoTitulosBancarios
* @author Manoel Campos da Silva Filho. http://manoelcampos.com/contato
* @version 0.2
*/
class RetornoCNAB400 extends RetornoBase {
/**@property int HEADER_ARQUIVO Define o valor que identifica uma coluna do tipo HEADER DE ARQUIVO*/
const HEADER_ARQUIVO = 0;
/**@property int DETALHE Define o valor que identifica uma coluna do tipo DETALHE*/
const DETALHE = 1;
/**@property int TRAILER_ARQUIVO Define o valor que identifica uma coluna do tipo TRAILER DE ARQUIVO*/
const TRAILER_ARQUIVO = 9;
/**Processa a linha header do arquivo
* @param string $linha Linha do header de arquivo processado
* @return array Retorna um vetor contendo os dados dos campos do header do arquivo.*/
protected function processarHeaderArquivo($linha) {
$vlinha = array();
//X = ALFANUMÉRICO 9 = NUMÉRICO V = VÍRGULA DECIMAL ASSUMIDA
$vlinha["id_registro"] = substr($linha, 1, 1); //9 Identificação do Registro Header: “0”
$vlinha["tipo_operacao"] = substr($linha, 2, 1); //9 Tipo de Operação: “2”
$vlinha["id_tipo_operacao"] = substr($linha, 3, 7); //X Identificação Tipo de Operação “RETORNO”
$vlinha["id_tipo_servico"] = substr($linha, 10, 2); //9 Identificação do Tipo de Serviço: “01”
$vlinha["tipo_servico"] = substr($linha, 12, 8); //X Identificação por Extenso do Tipo de Serviço: “COBRANCA”
$vlinha["complemento1"] = substr($linha, 20, 7); //X Complemento do Registro: “Brancos”
$vlinha["agencia_cedente"] = substr($linha, 27, 4); //9 Prefixo da Agência: N. Agência onde está cadastrado o convênio líder do cedente
$vlinha["dv_agencia_cedente"] = substr($linha, 31, 1); //X Dígito Verificador - D.V. - do Prefixo da Agência
$vlinha["conta_cedente"] = substr($linha, 32, 8); //9 Número da Conta Corrente onde está cadastrado o Convênio Líder do Cedente
$vlinha["dv_conta _cedente"] = substr($linha, 40, 1); //X Dígito Verificador - D.V. - da Conta Corrente do Cedente
$vlinha["convenio"] = substr($linha, 41, 6); //9 Número do convênio líder
$vlinha["nome_cedente"] = substr($linha, 47, 30); //X Nome do Cedente
$vlinha["cod_nome_banco"] = substr($linha, 77, 18); //X 001BANCODOBRASIL
$vlinha["data_gravacao"] = $this->formataData(substr($linha, 95, 6)); //9 Data da Gravação: Informe no formado “DDMMAA”
$vlinha["sequencial_ret"] = substr($linha, 101, 7); //9 Seqüencial do Retorno - nota 01
$vlinha["complemento2"] = substr($linha, 108, 287); //X Complemento do Registro: “Brancos”
$vlinha["sequencial_reg"] = substr($linha, 395, 6); //9 Seqüencial do Registro: ”000001”
return $vlinha;
}
/**Processa uma linha detalhe do arquivo.
* @param string $linha Linha detalhe do arquivo processado
* @return array Retorna um vetor contendo os dados dos campos da linha detalhe.*/
protected function processarDetalhe($linha) {
$vlinha = array();
//X = ALFANUMÉRICO 9 = NUMÉRICO V = VÍRGULA DECIMAL ASSUMIDA
$vlinha["id_registro"] = substr($linha, 1, 1); //9 Identificação do Registro Detalhe: 1 (um)
$vlinha["zeros1"] = substr($linha, 2, 2); //9 Zeros
$vlinha["zeros2"] = substr($linha, 4, 14); //9 Zeros
$vlinha["agencia"] = substr($linha, 18, 4); //9 Prefixo da Agência
$vlinha["dv_agencia"] = substr($linha, 22, 1); //X Dígito Verificador - D.V. - do Prefixo da Agência
$vlinha["cc_cedente"] = substr($linha, 23, 8); //9 Número da Conta Corrente do Cedente
$vlinha["dv_cc_cedente"] = substr($linha, 31, 1); //X Dígito Verificador - D.V. - do Número da Conta Corrente do Cedente
$vlinha["convenio"] = substr($linha, 32, 6); //9 Número do Convênio de Cobrança do Cedente
$vlinha["controle"] = substr($linha, 38, 25); //X Número de Controle do Participante
$vlinha["nosso_numero"] = substr($linha, 63, 11); //9 Nosso-Número
$vlinha["dv_nosso_numero"] = substr($linha, 74, 1); //X DV do Nosso-Número
$vlinha["tipo_cobranca"] = substr($linha, 75, 1); //9 Tipo de cobrança - nota 02
$vlinha["tipo_cobranca_cmd72"] = substr($linha, 76, 1); //9 Tipo de cobrança específico p/ comando 72
// (alteração de tipo de cobrança de títulos das carteiras 11 e 17) - nota 03
$vlinha["dias_calculo"] = substr($linha, 77, 4); //9 Dias para cálculo - nota 04
$vlinha["natureza"] = substr($linha, 81, 2); //9 Natureza do recebimento - nota 05
$vlinha["uso_banco1"] = substr($linha, 83, 3); //X Uso do Banco
$vlinha["variacao_carteira"] = substr($linha, 86, 3); //9 Variação da Carteira
$vlinha["conta_caucao"] = substr($linha, 89, 1); //9 Conta Caução - nota 06
$vlinha["uso_banco2"] = substr($linha, 90, 5); //9 Uso do Banco
$vlinha["uso_banco3"] = substr($linha, 95, 1); //X Uso do Banco
$vlinha["taxa_desconto"] = $this->formataNumero(substr($linha, 96, 5)); //9 v99 Taxa de desconto
$vlinha["taxa_iof"] = substr($linha, 101, 5); //9 Taxa de IOF
$vlinha["branco"] = substr($linha, 106, 1); //x Branco
$vlinha["carteira"] = substr($linha, 107, 2); //9 Carteira
$vlinha["comando"] = substr($linha, 109, 2); //9 Comando - nota 07
$vlinha["data_ent_liq"]=$this->formataData(substr($linha, 111, 6)); //X Data da Entrada/Liquidação (DDMMAA)
$vlinha["num_titulo"] = substr($linha, 117, 10); //X Número título dado pelo cedente - nota 06
$vlinha["confirmacao"] = substr($linha, 127, 20); //X Confirmação das posições 63 a 82
$vlinha["data_vencimento"] = substr($linha, 147, 6); //9 Data de vencimento (DDMMAA)
$vlinha["valor"]=$this->formataNumero(substr($linha, 153, 13)); //9 v99 Valor do título
$vlinha["cod_banco"] = substr($linha, 166, 3); //9 Código do banco recebedor - nota 08
$vlinha["agencia"] = substr($linha, 169, 4); //9 Prefixo da agência recebedora - nota 08
$vlinha["dv_agencia"] = substr($linha, 173, 1); //X DV prefixo recebedora
$vlinha["especia"] = substr($linha, 174, 2); //9 Espécie do título - 09
$vlinha["data_credito"] = substr($linha, 176, 6); //9 Data do crédito (DDMMAA) - nota 10
$vlinha["valor_tarifa"] = $this->formataNumero(substr($linha, 182, 7)); //9 v99 Valor da tarifa - nota 06
$vlinha["outras_despesas"] = $this->formataNumero(substr($linha, 189, 13)); //9 v99 Outras despesas
$vlinha["juros_desconto"] = $this->formataNumero(substr($linha, 202, 13)); //9 v99 Juros do desconto
$vlinha["iof_desconto"] = $this->formataNumero(substr($linha, 215, 13)); //9 v99 IOF do desconto
$vlinha["valor_abatimento"] = $this->formataNumero(substr($linha, 228, 13)); //9 v99 Valor do abatimento
//9 v99 Desconto concedido (diferença entre valor do título e valor recebido)
$vlinha["desconto_concedido"] = $this->formataNumero(substr($linha, 241, 13));
$vlinha["valor_recebido"] = $this->formataNumero(substr($linha, 254, 13)); //9 v99 Valor recebido (valor recebido parcial)
$vlinha["juros_mora"] = $this->formataNumero(substr($linha, 267, 13)); //9 v99 Juros de mora
$vlinha["outros_recebimentos"] = $this->formataNumero(substr($linha, 280, 13)); //9 v99 Outros recebimentos
$vlinha["abatimento_nao_aprov"]= $this->formataNumero(substr($linha, 293, 13)); //9 v99 Abatimento não aproveitado pelo sacado
$vlinha["valor_lancamento"] = $this->formataNumero(substr($linha, 306, 13)); //9 v99 Valor do lançamento
$vlinha["indicativo_dc"] = substr($linha, 319, 1); //9 Indicativo de débito/crédito - nota 11
$vlinha["indicador_valor"] = substr($linha, 320, 1); //9 Indicador de valor - nota 12
$vlinha["valor_ajuste"] = $this->formataNumero(substr($linha, 321, 12)); //9 v99 Valor do ajuste - nota 13
$vlinha["brancos1"] = substr($linha, 333, 1); //X Brancos (vide observação para cobrança compartilhada) 14
$vlinha["brancos2"] = substr($linha, 334, 9); //9 Brancos (vide observação para cobrança compartilhada) 14
$vlinha["zeros3"] = substr($linha, 343, 6); //9 Zeros - nota 14
$vlinha["zeros4"] = substr($linha, 349, 9); //9 Zeros - nota 14
$vlinha["zeros5"] = substr($linha, 358, 6); //9 Zeros - nota 14
$vlinha["zeros6"] = substr($linha, 364, 9); //9 Zeros - nota 14
$vlinha["zeros7"] = substr($linha, 373, 6); //9 Zeros - nota 14
$vlinha["zeros8"] = substr($linha, 379, 9); //9 Zeros - nota 14
$vlinha["brancos3"] = substr($linha, 388, 5); //X Brancos
$vlinha["canal_pag_titulo"] = substr($linha, 393, 2); //9 Canal de pagamento do título utilizado pelo sacado - nota 15
$vlinha["sequencial"] = substr($linha, 395, 6); //9 Seqüencial do registro
return $vlinha;
}
/**Processa a linha trailer do arquivo.
* @param string $linha Linha trailer do arquivo processado
* @return array Retorna um vetor contendo os dados dos campos da linha trailer do arquivo.*/
protected function processarTrailerArquivo($linha) {
$vlinha = array();
//X = ALFANUMÉRICO 9 = NUMÉRICO V = VÍRGULA DECIMAL ASSUMIDA
$vlinha["id_registro"] = substr($linha, 1, 1); //9 Identificação do Registro Trailer: “9”
$vlinha["2"] = substr($linha, 2, 1); //9 “2”
$vlinha["01"] = substr($linha, 3, 2); //9 “01”
$vlinha["001"] = substr($linha, 5, 3); //9 “001”
$vlinha["brancos"] = substr($linha, 8, 10); //X Brancos
$vlinha["cob_simples_qtd_titulos"] = substr($linha, 18, 8); //9 Cobrança Simples - quantidade de títulos
$vlinha["cob_simples_vlr_total"] = $this->formataNumero(substr($linha, 26, 14)); //9 v99 Cobrança Simples - valor total
$vlinha["cob_simples_num_aviso"] = substr($linha, 40, 8); //9 Cobrança Simples - Número do aviso
$vlinha["cob_simples_brancos"] = substr($linha, 48, 10); //X Cobrança Simples - Brancos
$vlinha["cob_vinc_qtd_titulos"] = substr($linha, 58, 8); //9 Cobrança Vinculada - quantidade de títulos
$vlinha["cob_vinc_valor_total"] = $this->formataNumero(substr($linha, 66, 14)); //9 v99 Cobrança Vinculada - valor total
$vlinha["cob_vinc_num_aviso"] = substr($linha, 80, 8); //9 Cobrança Vinculada - Número do aviso
$vlinha["cob_vinc_brancos"] = substr($linha, 88, 10); //X Cobrança Vinculada - Brancos
$vlinha["cob_cauc_qtd_titulos"] = substr($linha, 98, 8); //9 Cobrança Caucionada - quantidade de títulos
$vlinha["cob_cauc_vlr_total"] = $this->formataNumero(substr($linha, 106, 14)); //9 v99 Cobrança Caucionada - valor total
$vlinha["cob_cauc_num_aviso"] = substr($linha, 120, 8); //9 Cobrança Caucionada - Número do aviso
$vlinha["cob_cauc_brancos"] = substr($linha, 128, 10); //X Cobrança Caucionada - Brancos
$vlinha["cob_desc_qtd_titulos"] = substr($linha, 138, 8); //9 Cobrança Descontada - quantidade de títulos
$vlinha["cob_desc_vlr_total"] = $this->formataNumero(substr($linha, 146, 14)); //9 v99 Cobrança Descontada - valor total
$vlinha["cob_desc_num_aviso"] = substr($linha, 160, 8); //9 Cobrança Descontada - Número do aviso
$vlinha["cob_desc_brancos"] = substr($linha, 168, 50); //X Cobrança Descontada - Brancos
$vlinha["cob_vendor_qtd_titulos"] = substr($linha, 218, 8); //9 Cobrança Vendor - quantidade de títulos
$vlinha["cob_vendor_vlr_total"] = $this->formataNumero(substr($linha, 226, 14)); //9 v99 Cobrança Vendor - valor total
$vlinha["cob_vendor_num_aviso"] = substr($linha, 240, 8); //9 Cobrança Vendor - Número do aviso
$vlinha["cob_vendor_brancos"] = substr($linha, 248, 147); //X Cobrança Vendor – Brancos
$vlinha["sequencial"] = substr($linha, 395, 6); //9 Seqüencial do registro
return $vlinha;
}
/**Processa uma linha_arquivo_retorno.
* @param int $numLn Número_linha a ser processada
* @param string $linha String contendo a linha a ser processada
* @return array Retorna um vetor associativo contendo os valores_linha processada.*/
public function processarLinha($numLn, $linha) {
$tamLinha = 400; //total de caracteres das linhas do arquivo
//o +2 é utilizado para contar o \r\n no final da linha
if(strlen($linha)!=$tamLinha and strlen($linha)!=$tamLinha+2)
die("A linha $numLn não tem $tamLinha posições. Possui " . strlen($linha));
if(trim($linha)=="")
die("A linha $numLn está vazia.");
//é adicionado um espaço vazio no início_linha para que
//possamos trabalhar com índices iniciando_1, no lugar_zero,
//e assim, ter os valores_posição_campos exatamente
//como no manual CNAB400
$linha = " $linha";
$tipoLn = substr($linha, 1, 1);
if($tipoLn == RetornoCNAB400::HEADER_ARQUIVO)
$vlinha = $this->processarHeaderArquivo($linha);
else if($tipoLn == RetornoCNAB400::DETALHE)
$vlinha = $this->processarDetalhe($linha);
else if($tipoLn == RetornoCNAB400::TRAILER_ARQUIVO)
$vlinha = $this->processarTrailerArquivo($linha);
return $vlinha;
}
}
?>