public function decodeTrailerLote(Linha $linha)
 {
     $dados = array();
     $layout = $linha->getTipo() === 'remessa' ? $linha->getLayout()->getRemessaLayout() : $linha->getLayout()->getRetornoLayout();
     $campos = $layout['trailer_lote'];
     foreach ($campos as $nome => $definicao) {
         $dados[$nome] = $linha->obterValorCampo($definicao);
     }
     return $dados;
 }
 protected function calculaTotalLotes()
 {
     $this->totalLotes = 1;
     $layout = $this->layout->getLayout();
     $linhaTrailerArquivoStr = $this->linhas[count($this->linhas) - 1];
     $linha = new Linha($linhaTrailerArquivoStr, $this->layout, 'retorno');
     if (strtoupper($layout) === strtoupper('cnab240')) {
         // conforme cnab240 febraban
         $definicao = array('pos' => array(18, 23), 'picture' => '9(6)');
         $this->totalLotes = (int) $linha->obterValorCampo($definicao);
     } elseif (strtoupper($layout) === strtoupper('cnab400')) {
         $this->totalLotes = 1;
         // cnab400 apenas 1 lote
     }
     return $this->totalLotes;
 }
 private function decodeLotesCnab400()
 {
     $defTipoRegistro = array('pos' => array(1, 1), 'picture' => '9(1)');
     // para Cnab400 codigo do segmento na configuracao yaml é o codigo do registro
     $defCodigoSegmento = array('pos' => array(1, 1), 'picture' => '9(1)');
     $defNumeroRegistro = array('pos' => array(395, 400), 'picture' => '9(6)');
     $codigoLote = null;
     $primeiroCodigoSegmentoLayout = $this->layout->getPrimeiroCodigoSegmentoRetorno();
     $ultimoCodigoSegmentoLayout = $this->layout->getUltimoCodigoSegmentoRetorno();
     $lote = null;
     $segmentos = array();
     foreach ($this->linhas as $index => $linhaStr) {
         $linha = new Linha($linhaStr, $this->layout, 'retorno');
         $tipoRegistro = (int) $linha->obterValorCampo($defTipoRegistro);
         if ($tipoRegistro === IntercambioBancarioRetornoFileAbstract::REGISTRO_HEADER_ARQUIVO) {
             continue;
         }
         if ($tipoRegistro === IntercambioBancarioRetornoFileAbstract::REGISTRO_TRAILER_ARQUIVO) {
             $lote['titulos'][] = $segmentos;
             $segmentos = array();
             break;
         }
         // estamos tratando detalhes
         $codigoSegmento = $linha->obterValorCampo($defCodigoSegmento);
         $numeroRegistro = $linha->obterValorCampo($defNumeroRegistro);
         $dadosSegmento = $linha->getDadosSegmento('segmento_' . strtolower($codigoSegmento));
         $segmentos[$codigoSegmento] = $dadosSegmento;
         $proximaLinha = new Linha($this->linhas[$index + 1], $this->layout, 'retorno');
         $proximoCodigoSegmento = $proximaLinha->obterValorCampo($defCodigoSegmento);
         // se (
         // 	proximo codigoSegmento é o primeiro OU
         // 	codigoSegmento é ultimo
         // )
         // entao fecha o titulo e adiciona em $detalhes
         if (strtolower($proximoCodigoSegmento) === strtolower($primeiroCodigoSegmentoLayout) || strtolower($codigoSegmento) === strtolower($ultimoCodigoSegmentoLayout)) {
             $lote['titulos'][] = $segmentos;
             // novo titulo, novos segmentos
             $segmentos = array();
         }
     }
     $this->model->lotes[] = $lote;
 }