/** * readReturnSefaz * Trata o retorno da SEFAZ devolvendo o resultado em um array * @param string $method * @param string $xmlResp * @param mixed $parametro * @return array */ public static function readReturnSefaz($method, $xmlResp) { $dom = new Dom('1.0', 'utf-8'); $dom->loadXMLString($xmlResp); //para cada $method tem um formato de retorno especifico switch ($method) { case 'MDFeRecepcao': return self::zReadRecepcaoLote($dom); break; case 'MDFeRetRecepcao': return self::zReadRetRecepcao($dom); break; case 'MDFeConsultaSituacao': return self::zReadConsultaMDF($dom); break; case 'MDFeStatusServico': return self::zReadStatusServico($dom); break; case 'MDFeRecepcaoEvento': return self::zReadRecepcaoEvento($dom); break; case 'MDFeConsNaoEnc': return self::zReadConsNaoEnc($dom); break; } return array(); }
/** * readReturnSefaz * Trata o retorno da SEFAZ devolvendo o resultado em um array * * @param string $method * @param string $xmlResp * @return array */ public static function readReturnSefaz($method, $xmlResp) { $dom = new Dom('1.0', 'utf-8'); $dom->loadXMLString($xmlResp); if ($reason = self::checkForFault($dom) != '') { return array('Fault' => $reason); } //para cada $method tem um formato de retorno especifico switch ($method) { case 'NfeAutorizacao': return self::zReadAutorizacaoLote($dom); break; case 'NfeRetAutorizacao': return self::zReadRetAutorizacaoLote($dom); break; case 'NfeConsultaCadastro': return self::zReadConsultaCadastro2($dom); break; case 'NfeConsultaProtocolo': return self::zReadConsultaNF2($dom); break; case 'NfeInutilizacao': return self::zReadInutilizacaoNF2($dom); break; case 'NfeStatusServico': //NOTA: irá ser desativado return self::zReadStatusServico($dom); break; case 'RecepcaoEPEC': case 'RecepcaoEvento': return self::zReadRecepcaoEvento($dom); break; case 'NfeDistribuicaoDFe': return self::zReadDistDFeInteresse($dom); break; case 'NfeDownloadNF': return self::zReadDownloadNF($dom); break; case 'CscNFCe': return self::zReadCscNFCe($dom); break; } return array(); }
/** * identificacao * Identifica o documento * @param type $xml * @return string */ public static function identificacao($xml = '', &$aResp = array()) { if ($xml == '') { return ''; } elseif (is_file($xml)) { $xml = FilesFolders::readFile($xml); } $dom = new Dom('1.0', 'utf-8'); $dom->loadXMLString($xml); $key = ''; $schId = (string) self::zSearchNode($dom, $key); if ($schId == '') { return ''; } $chave = ''; $tpAmb = ''; $dhEmi = ''; if ($schId == 'nfe' || $schId == 'cte' || $schId == 'mdfe') { switch ($schId) { case 'nfe': $tag = 'infNFe'; break; case 'cte': $tag = 'infCte'; break; case 'mdfe': $tag = 'infMDFe'; break; } $chave = $dom->getChave($tag); $tpAmb = $dom->getNodeValue('tpAmb'); $dhEmi = $dom->getNodeValue('dhEmi'); } $aResp['Id'] = $schId; $aResp['tag'] = $key; $aResp['dom'] = $dom; $aResp['chave'] = $chave; $aResp['tpAmb'] = $tpAmb; $aResp['dhEmi'] = $dhEmi; return $schId; }
/** * zGetInfo * Busca informações do XML * para uso no sefazEPEC * @param string $xml * @return array */ protected function zGetInfo($xml) { $dom = new Dom(); $dom->loadXMLString($xml); $ide = $dom->getNode('ide'); $emit = $dom->getNode('emit'); $dest = $dom->getNode('dest'); $enderDest = $dest->getElementsByTagName('enderDest')->item(0); $icmsTot = $dom->getNode('ICMSTot'); $resp = array('chave' => $dom->getChave('infNFe'), 'dhCont' => $dom->getValue($ide, 'dhCont'), 'xJust' => $dom->getValue($ide, 'xJust'), 'cOrgaoAutor' => $dom->getValue($ide, 'cUF'), 'tpAutor' => '1', 'dhEmi' => $dom->getValue($ide, 'dhEmi'), 'tpNF' => $dom->getValue($ide, 'tpNF'), 'IE' => $dom->getValue($emit, 'IE'), 'UF' => $dom->getValue($enderDest, 'UF'), 'CNPJ' => $dom->getValue($dest, 'CNPJ'), 'CPF' => $dom->getValue($dest, 'CPF'), 'idEstrangeiro' => $dom->getValue($dest, 'idEstrangeiro'), 'IEdest' => $dom->getValue($dest, 'IE'), 'vNF' => $dom->getValue($icmsTot, 'vNF'), 'vICMS' => $dom->getValue($icmsTot, 'vICMS'), 'vST' => $dom->getValue($icmsTot, 'vST')); return $resp; }
/** * assinaDoc * @param string $xml * @param string $tipo nfe, cte, ou mdfe * @param string $tag Nome da tag a ser assinada * @param boolean $saveFile APENAS para salvar NFe, CTe ou MDFe * @return string * @throws Exception\InvalidArgumentException * @throws Exception\RuntimeException */ public function assinaDoc($xml = '', $tipo = '', $tag = '', $saveFile = false) { if ($tag == '') { $msg = 'Deve ser indicada uma tag a ser assinada'; throw new Exception\InvalidArgumentException($msg); } if (is_file($xml)) { $xml = Files\FilesFolders::readFile($xml); } $sxml = $this->oCertificate->signXML($xml, $tag); $dom = new Dom(); $dom->loadXMLString($sxml); //$versao = $dom->getElementsByTagName($tag)->item(0)->getAttribute('versao'); //if (! $this->zValidMessage($sxml, $tipo, $versao)) { //$msg = "Falha na validação do $tipo. ".$this->error; // throw new Exception\RuntimeException($msg); //} if ($saveFile && $tipo != '') { $dom = new Dom(); $dom->loadXMLString($sxml); $tpAmb = $dom->getElementsByTagName('tpAmb')->item(0)->nodeValue; $anomes = date('Ym', DateTime::convertSefazTimeToTimestamp($dom->getElementsByTagName('dhEmi')->item(0)->nodeValue)); $chave = $dom->getChave($tag); $filename = "{$chave}-{$tipo}.xml"; $this->zGravaFile($tipo, $tpAmb, $filename, $sxml, 'assinadas', $anomes); } return $sxml; }
/** * verifySignature * Verifica a validade da assinatura digital contida no xml * @param string $docxml conteudo do xml a ser verificado ou o path completo * @param string $tagid tag que foi assinada no documento xml * @return boolean * @throws Exception\InvalidArgumentException * @throws Exception\RuntimeException */ public function verifySignature($docxml = '', $tagid = '') { if ($docxml == '') { $msg = "Não foi passado um xml para a verificação."; throw new Exception\InvalidArgumentException($msg); } if ($tagid == '') { $msg = "Não foi indicada a TAG a ser verificada."; throw new Exception\InvalidArgumentException($msg); } $xml = $docxml; if (is_file($docxml)) { $xml = file_get_contents($docxml); } $dom = new Dom(); $dom->loadXMLString($xml); $flag = $this->zDigCheck($dom, $tagid); $flag = $this->zSignCheck($dom); return $flag; }
/** * zTrataProcEvent * @param array $resp */ private static function zTrataProcEvent($resp = array()) { $aResp = array(); $content = $resp['doc']; $dom = new Dom(); $dom->loadXMLString($content); $xmldata = $dom->saveXML(); $xmldata = str_replace('<?xml version="1.0"?>', '<?xml version="1.0" encoding="utf-8"?>', $xmldata); $data = $dom->getNodeValue('dhEvento'); $tsdhevento = DateTime::convertSefazTimeToTimestamp($data); $anomes = date('Ym', $tsdhevento); $tpEvento = $dom->getNodeValue('tpEvento'); $chave = $dom->getNodeValue('chNFe'); if ($tpEvento == '110111') { //confirmado cancelamento, localizar o xml da NFe recebida //na pasta anomes $path = $this->pathNFe . DIRECTORY_SEPARATOR . $this->ambiente . DIRECTORY_SEPARATOR . "recebidas" . DIRECTORY_SEPARATOR . $anomes; $pathFile = $path . DIRECTORY_SEPARATOR . $chave . '-nfe.xml'; self::zCancela($pathFile); $aResp[] = array('tipo' => '-cancNFe.xml', 'chave' => $chave, 'anomes' => $anomes, 'xml' => $xmldata); } elseif ($tpEvento == '110110') { //evento Carta de Correção $aResp[] = array('tipo' => '-cce.xml', 'chave' => $chave, 'anomes' => $anomes, 'xml' => $xmldata); } return $aResp; }
/** * addCancelamento * Adiciona a tga de cancelamento a uma CTe já autorizada * NOTA: não é requisito da SEFAZ, mas auxilia na identificação das CTe que foram canceladas * @param string $pathCTefile * @param string $pathCancfile * @param bool $saveFile * @return string * @throws Exception\RuntimeException */ public function addCancelamento($pathCTefile = '', $pathCancfile = '', $saveFile = false) { $procXML = ''; //carrega a CTe $docCTe = new Dom(); if (file_exists($pathCTefile)) { //carrega o XML pelo caminho do arquivo informado $docCTe->loadXMLFile($pathCTefile); } else { //carrega o XML pelo conteúdo $docCTe->loadXMLString($pathCTefile); } $nodeCTe = $docCTe->getNode('CTe', 0); if ($nodeCTe == '') { $msg = "O arquivo indicado como CTe não é um xml de CTe!"; throw new Exception\RuntimeException($msg); } $proCTe = $docCTe->getNode('protCTe'); if ($proCTe == '') { $msg = "A CTe não está protocolada ainda!!"; throw new Exception\RuntimeException($msg); } $chaveCTe = $proCTe->getElementsByTagName('chCTe')->item(0)->nodeValue; //$nProtCTe = $proCTe->getElementsByTagName('nProt')->item(0)->nodeValue; $tpAmb = $docCTe->getNodeValue('tpAmb'); $anomes = date('Ym', DateTime::convertSefazTimeToTimestamp($docCTe->getNodeValue('dhEmi'))); //carrega o cancelamento //pode ser um evento ou resultado de uma consulta com multiplos eventos $doccanc = new Dom(); if (file_exists($pathCancfile)) { //carrega o XML pelo caminho do arquivo informado $doccanc->loadXMLFile($pathCancfile); } else { //carrega o XML pelo conteúdo $doccanc->loadXMLString($pathCancfile); } $retEvento = $doccanc->getElementsByTagName('retEventoCTe')->item(0); $eventos = $retEvento->getElementsByTagName('infEvento'); foreach ($eventos as $evento) { //evento $cStat = $evento->getElementsByTagName('cStat')->item(0)->nodeValue; $tpAmb = $evento->getElementsByTagName('tpAmb')->item(0)->nodeValue; $chaveEvento = $evento->getElementsByTagName('chCTe')->item(0)->nodeValue; $tpEvento = $evento->getElementsByTagName('tpEvento')->item(0)->nodeValue; //$nProtEvento = $evento->getElementsByTagName('nProt')->item(0)->nodeValue; //verifica se conferem os dados //cStat = 135 ==> evento homologado //cStat = 136 ==> vinculação do evento à respectiva NF-e prejudicada //cStat = 155 ==> Cancelamento homologado fora de prazo //tpEvento = 110111 ==> Cancelamento //chave do evento == chave da CTe //protocolo do evneto == protocolo da CTe if (($cStat == '135' || $cStat == '136' || $cStat == '155') && $tpEvento == '110111' && $chaveEvento == $chaveCTe) { $proCTe->getElementsByTagName('cStat')->item(0)->nodeValue = '101'; $proCTe->getElementsByTagName('xMotivo')->item(0)->nodeValue = 'Cancelamento de CT-e homologado'; $procXML = $docCTe->saveXML(); //remove as informações indesejadas $procXML = Strings::clearProt($procXML); if ($saveFile) { $filename = "{$chaveCTe}-protCTe.xml"; $this->zGravaFile('cte', $tpAmb, $filename, $procXML, 'canceladas', $anomes); } break; } } return (string) $procXML; }