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; }