public function addCancelamento($pathNFefile = '', $pathCancfile = '', $saveFile = false)
{
$procXML = '';
//carrega a NFe
$docnfe = new Dom();
$docnfe->loadXMLFile($pathNFefile);
$nodenfe = $docnfe->getNode('NFe', 0);
if ($nodenfe == '') {
$msg = "O arquivo indicado como NFe não é um xml de NFe!";
throw new Exception\RuntimeException($msg);
}
$proNFe = $docnfe->getNode('protNFe');
if ($proNFe == '') {
$msg = "A NFe não está protocolada ainda!!";
throw new Exception\RuntimeException($msg);
}
$chaveNFe = $proNFe->getElementsByTagName('chNFe')->item(0)->nodeValue;
//$nProtNFe = $proNFe->getElementsByTagName('nProt')->item(0)->nodeValue;
$tpAmb = $docnfe->getNodeValue('tpAmb');
$anomes = date('Ym', DateTime::convertSefazTimeToTimestamp($docnfe->getNodeValue('dhEmi')));
//carrega o cancelamento
//pode ser um evento ou resultado de uma consulta com multiplos eventos
$doccanc = new Dom();
$doccanc->loadXMLFile($pathCancfile);
$retEvento = $doccanc->getElementsByTagName('retEvento')->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('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
//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 NFe
//protocolo do evneto == protocolo da NFe
if (($cStat == '135' || $cStat == '136' || $cStat == '155') && $tpEvento == '110111' && $chaveEvento == $chaveNFe) {
$proNFe->getElementsByTagName('cStat')->item(0)->nodeValue = '101';
$proNFe->getElementsByTagName('xMotivo')->item(0)->nodeValue = 'Cancelamento de NF-e homologado';
$procXML = $docnfe->saveXML();
//remove as informações indesejadas
$procXML = Strings::clearProt($procXML);
if ($saveFile) {
$filename = "{$chaveNFe}-protNFe.xml";
$this->zGravaFile('nfe', $tpAmb, $filename, $procXML, 'canceladas', $anomes);
}
break;
}
}
return (string) $procXML;
}