예제 #1
0
 /**
  * addCancelamento
  * Adiciona a tga de cancelamento a uma MDFe já autorizada
  * NOTA: não é requisito da SEFAZ, mas auxilia na identificação das MDFe que foram canceladas
  * @param string $pathMDFefile
  * @param string $pathCancfile
  * @param bool $saveFile
  * @return string
  * @throws Exception\RuntimeException
  */
 public function addCancelamento($pathMDFefile = '', $pathCancfile = '', $saveFile = false)
 {
     $procXML = '';
     //carrega a NFe
     $docmdfe = new Dom();
     $docmdfe->loadXMLFile($pathMDFefile);
     $nodemdfe = $docmdfe->getNode('MDFe', 0);
     if ($nodemdfe == '') {
         $msg = "O arquivo indicado como MDFe não é um xml de MDFe!";
         throw new Exception\RuntimeException($msg);
     }
     $proMDFe = $docmdfe->getNode('protMDFe');
     if ($proMDFe == '') {
         $msg = "O MDFe não está protocolado ainda!!";
         throw new Exception\RuntimeException($msg);
     }
     $chaveMDFe = $proMDFe->getElementsByTagName('chMDFe')->item(0)->nodeValue;
     //$nProtNFe = $proNFe->getElementsByTagName('nProt')->item(0)->nodeValue;
     $tpAmb = $docmdfe->getNodeValue('tpAmb');
     $anomes = date('Ym', DateTime::convertSefazTimeToTimestamp($docmdfe->getNodeValue('dhEmi')));
     //carrega o cancelamento
     //pode ser um evento ou resultado de uma consulta com multiplos eventos
     $doccanc = new Dom();
     $doccanc->loadXMLFile($pathCancfile);
     $eventos = $doccanc->getElementsByTagName('infEvento');
     foreach ($eventos as $evento) {
         //evento
         $cStat = $evento->getElementsByTagName('cStat')->item(0)->nodeValue;
         $tpAmb = $evento->getElementsByTagName('tpAmb')->item(0)->nodeValue;
         $chaveEvento = $evento->getElementsByTagName('chNFe')->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
         //tpEvento = 110111 ==> Cancelamento
         //chave do evento == chave da NFe
         //protocolo do evneto ==  protocolo da NFe
         if ($cStat == '135' && $tpEvento == '110111' && $chaveEvento == $chaveMDFe) {
             $proMDFe->getElementsByTagName('cStat')->item(0)->nodeValue = '101';
             $proMDFe->getElementsByTagName('xMotivo')->item(0)->nodeValue = 'Cancelamento de NF-e homologado';
             $procXML = $docmdfe->saveXML();
             //remove as informações indesejadas
             $procXML = Strings::clearProt($procXML);
             if ($saveFile) {
                 $filename = "{$chaveMDFe}-protMDFe.xml";
                 $this->zGravaFile('mdfe', $tpAmb, $filename, $procXML, 'enviadas' . DIRECTORY_SEPARATOR . 'aprovadas', $anomes);
             }
             break;
         }
     }
     return (string) $procXML;
 }
예제 #2
0
 /**
  * zAddProtMsg
  * @param string $tagproc
  * @param string $tagmsg
  * @param string $xmlmsg
  * @param string $tagretorno
  * @param string $xmlretorno
  * @return string
  */
 protected function zAddProtMsg($tagproc, $tagmsg, $xmlmsg, $tagretorno, $xmlretorno)
 {
     $doc = new Dom();
     $doc->loadXMLString($xmlmsg);
     $nodedoc = $doc->getNode($tagmsg, 0);
     $procver = $nodedoc->getAttribute("versao");
     $procns = $nodedoc->getAttribute("xmlns");
     $doc1 = new Dom();
     $doc1->loadXMLString($xmlretorno);
     $nodedoc1 = $doc1->getNode($tagretorno, 0);
     $proc = new \DOMDocument('1.0', 'utf-8');
     $proc->formatOutput = false;
     $proc->preserveWhiteSpace = false;
     //cria a tag nfeProc
     $procNode = $proc->createElement($tagproc);
     $proc->appendChild($procNode);
     //estabele o atributo de versão
     $procNodeAtt1 = $procNode->appendChild($proc->createAttribute('versao'));
     $procNodeAtt1->appendChild($proc->createTextNode($procver));
     //estabelece o atributo xmlns
     $procNodeAtt2 = $procNode->appendChild($proc->createAttribute('xmlns'));
     $procNodeAtt2->appendChild($proc->createTextNode($procns));
     //inclui a tag inutNFe
     $node = $proc->importNode($nodedoc, true);
     $procNode->appendChild($node);
     //inclui a tag retInutNFe
     $node = $proc->importNode($nodedoc1, true);
     $procNode->appendChild($node);
     //salva o xml como string em uma variável
     $procXML = $proc->saveXML();
     //remove as informações indesejadas
     $procXML = Strings::clearProt($procXML);
     return $procXML;
 }
예제 #3
0
 /**
  * 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;
 }